使用Promise时,SendResponse失败

时间:2015-10-13 12:49:47

标签: javascript google-chrome-extension promise

在我正在构建的扩展程序中,点击一个按钮,就会从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没有任何关系。

0 个答案:

没有答案