Javascript 使用承诺时SendResponse失败
在我正在构建的扩展中,单击一个按钮,就会从ChromeUtils.js发送一个请求Javascript 使用承诺时SendResponse失败,javascript,google-chrome-extension,promise,Javascript,Google Chrome Extension,Promise,在我正在构建的扩展中,单击一个按钮,就会从ChromeUtils.js发送一个请求 return new Promise(function(fulfill,reject){ var request = { type : "background.twitterRequestToken", }; chrome.runtime.sendMessage(request, function(respo
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脚本,但是由于一个需求,我修改了oauth以使用promise。当作为承诺实现时,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
我希望使用承诺的原因是,当使用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;
}
我已经在我的代码中包含了returntrue,正如我所解释的,当不使用Promise时,它可以很好地工作。使用Promise时失败,因为我包含了错误消息
===================更新========
为了重新说明这一点,我创建了一个更简单的示例,但当我使用承诺时,我不会面临这个问题。所以这可能与承诺无关 是否可以提供一个可用于验证/调试问题的自包含示例?此问题可能会关闭,因为问题不是因为sendResponse失败。在sendResponse之后,我在控制台上收到的错误消息是由于在oauth使用twitter之后,页面正在关闭,这导致了错误消息。当我再次打开扩展时,错误消息来自oauth页面关闭时的,而不是之后的。登录后,我得到了一些未定义的值,由于错误消息,我认为sendResponse失败了,而实际上是由于代码中的另一个错误。