Javascript 使用承诺时SendResponse失败

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

在我正在构建的扩展中,单击一个按钮,就会从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脚本,但是由于一个需求,我修改了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失败了,而实际上是由于代码中的另一个错误。