Javascript 消息回调同步错误
在扩展的内容脚本中,我从background.js请求数据,如下所示: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
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:再次感谢您澄清这一点,我感谢您为纠正我所做的努力……谢谢:)