在我正在构建的扩展程序中,点击一个按钮,就会从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;
}
我正在使用https://developer.chrome.com/extensions/tut_oauth中给出的示例中的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;
}
我已经在我的代码中包含了返回true,正如我解释的那样,在不使用Promise时它可以正常工作。使用Promise时失败,因为我包含的错误消息。
===============更新======
为了重复这个,我创建了一个更简单的例子,但是当我使用Promise时,我没有遇到问题。所以这可能与Promise没有任何关系。