Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 消息回调同步错误_Javascript_Google Chrome Extension_Content Script - Fatal编程技术网

Javascript 消息回调同步错误

Javascript 消息回调同步错误,javascript,google-chrome-extension,content-script,Javascript,Google Chrome Extension,Content Script,在扩展的内容脚本中,我从background.js请求数据,如下所示: fireOnNewTopic (); // Initial run on cold start or full reload. window.addEventListener ("hashchange", fireOnNewTopic, false); function fireOnNewTopic () { /*-- For the pages we want, location.hash will contain

在扩展的内容脚本中,我从background.js请求数据,如下所示:

fireOnNewTopic ();  // Initial run on cold start or full reload.

window.addEventListener ("hashchange", fireOnNewTopic,  false);

function fireOnNewTopic () {
/*-- For the pages we want, location.hash will contain values
    like: "#!newtopic/{group title}"
*/
  if (location.hash) {
    var locHashParts    = location.hash.split ('/');
    if (locHashParts.length > 1  &&  locHashParts[0] == '#!newtopic') {
        var subjectStr  = '';
        var bodyStr  = '';
        switch (locHashParts[1]) {
            case 'opencomments-site-discussions':
            chrome.extension.sendMessage({name:"domain"},
                function(response)
                {
                subjectStr = response.domain;   
                });
            chrome.extension.sendMessage({name:"url"},
                function(response)
                {
                bodyStr = "URL of last page visited: " +                        response.url;   
                });
                break;
            default:
                break;
        }

        if (subjectStr && bodyStr) {
            runPayloadCode (subjectStr, bodyStr);
        }
    }
  }
}

不幸的是,由于sendMessage()与回调异步运行,当代码到达runPayloadCode()时,subjectStr和bodyStr仍然为空,因为background.js中的代码尚未完成。同步代码以便在调用runPayloadCode()时填写subjectStr和bodyStr的最佳方法是什么?

您可以尝试以下代码:

case 'opencomments-site-discussions':
chrome.extension.sendMessage({
    name: "domain"
},

function (response) {
    subjectStr = response.domain;
  if(subjectStr){
    chrome.extension.sendMessage({
        name: "url"
    },

    function (response) {
        bodyStr = "URL of last page visited: " + response.url;
        if (bodyStr) {
            runPayloadCode(subjectStr, bodyStr);
        }
    });
}
});

但是,您不能将message的
chrome.extension.sendMessage({name:“url”})和
chrome.extension.sendMessage({name:“domain”})
合并为一条消息(因为我认为它们是独立的)并消除多个嵌套吗?

来详细说明Sudarshan关于将两个请求合并为一个请求的说法(抱歉,需要代码,所以不能只是注释)以下是您可以做的…
发送

chrome.extension.sendMessage({url: true, domain:true}, function(response) {
  console.debug('The url is "'+response.url+'" and the domain is"'+response.domain+'"');
  if (repsone.url && response.domain) {
            runPayloadCode (subjectStr, "URL of last page visited: " + response.domain);
        }
});
或者,如果你出于某种原因想让它更像你的案例,也许这就是你想要的东西

    if(location.hash) {
        var locHashParts = location.hash.split('/');
        if(locHashParts.length > 1 && locHashParts[0] == '#!newtopic') {
            var subjectStr = '';
            var bodyStr = '';
            var request = {};
            switch(locHashParts[1]) {
            case 'opencomments-site-discussions':

                request = {
                    url: true,
                    domain: true
                }
                break;
            default:
                break;
            }

            chrome.extension.sendMessage(request, function(response) {
                console.debug('The url is "' + response.url + '" and the domain is"' + response.domain + '"');
                if(repsone.url && response.domain) {
                    runPayloadCode(subjectStr, "URL of last page visited: " + response.domain);
                }
            });

        }
    }
}  

chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) {
    var response = {};
    if(request.url) {
        response.url = "someURL";
    }
    if(request.domain) {
        response.domain = "someDomain";
    }
    sendResponse(response);
});

这就是你想要的吗?这并不能解决异步操作的问题。如果我在内容脚本中设置断点,让它等待侦听器响应,当然,它会工作;否则,它会在返回数据之前到达断点。根据PAEz的建议,我替换了两个sendMessage()如我所说,只要我强制内容脚本等待一段时间,我就会返回URL和域:chrome.extension.sendMessage({URL:true,domain:true},function(response){subjectStr=response.domain;bodyStr=“上次访问页面的URL:”+response.url;});只要把
if(subjectStr&&bodyStr){runPayloadCode(subjectStr,bodyStr);}
在响应函数中是的,我可以将两个请求合并为一个,这一部分工作正常,但异步操作的基本问题仍然困扰着我;请参阅下面的评论。@PAEz:再次感谢您澄清这一点,我感谢您为纠正我所做的努力……谢谢:)