在我正在构建的扩展中,单击按钮,就会从 ChromeUtils.js 发送请求
return new Promise(function(fulfill,reject){
var request = {
type : "background.twitterRequestToken",
};
chrome.runtime.sendMessage(request, function(response) {
if (response)
{
fulfill(response);
}
else
{
reject(response);
}
});
});
到background.js,后者调用oauth Api来向远程服务器发送请求。
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
console.log("background.js: " + JSON.stringify(request));
var type = request.type;
if (type == "background.twitterRequestToken")
{
oauth.authorize().then(function(token,secret,userId,screenname){
console.log("Sending Response on Authorize");
sendResponse({success:true,userId:userId,screenName:screenname});
});
console.log("Before Return true");
return true;
}
我正在使用以下示例中的 oauth 脚本https://developer.chrome.com/extensions/tut_oauth https://developer.chrome.com/extensions/tut_oauth但由于要求修改了 oauth 以使用 Promise。当作为 Promise 实现时,sendResponse 会失败,但是当使用回调的默认实现时。 sendResponse 会通过。
使用回调的默认实现:
if (type == "background.twitterRequestToken")
{
oauth.authorize(function(token,secret,userId,screenname){
console.log("Sending Response on Authorize");
sendResponse({success:true,userId:userId,screenName:screenname});
});
console.log("Before Return true");
return true;
}
当作为承诺实现时,后台控制台中的错误消息是
Uncaught (in promise) Error: Attempting to use a disconnected port object
我想使用 Promise 的原因是,当使用 Oauth 发送signedRequests 时,我想在 sendResponse 中包含部分 xhr 响应,例如如下所示。
if (type == "background.tweet")
{
var status = request.tweet.text;
var url = "https://api.twitter.com/1.1/statuses/update.json";
var request = {
'method':'POST',
'parameters': {
'status':status
}
}
oauth.sendSignedRequest(url,request).then(signedRequestCallback).then(function(resp,xhr){
console.log("signedRequestCallback success");
console.log("Sending response");
sendResponse({success:true,status_id:resp.id});
});
return true;
}
我已经在我的代码中包含了 return true ,正如我所解释的,它在不使用 Promise 时工作得很好。使用 Promise 时会失败,因为我包含了错误消息。
===============更新========
为了重现这一点,我创建了一个更简单的示例,但是当我使用 Promise 时,我不会遇到这个问题。所以这可能和Promise没有任何关系。