Javascript 如何使循环中的函数同步运行?
我正在开发一个chrome插件,需要从“应用程序页面”向“内容脚本”发送消息,然后从循环中获取返回消息。但是,由于循环在开始下一次迭代之前不会等待sendMessage返回值,因此它会将返回值搞砸。下面是代码的示例:Javascript 如何使循环中的函数同步运行?,javascript,jquery,loops,google-chrome-extension,synchronization,Javascript,Jquery,Loops,Google Chrome Extension,Synchronization,我正在开发一个chrome插件,需要从“应用程序页面”向“内容脚本”发送消息,然后从循环中获取返回消息。但是,由于循环在开始下一次迭代之前不会等待sendMessage返回值,因此它会将返回值搞砸。下面是代码的示例: for (i=0; i<data[i2].data.length; i++) { console.log("SENDING: i=" + i + "; i2=" + i2); // Send message to content script wit
for (i=0; i<data[i2].data.length; i++)
{
console.log("SENDING: i=" + i + "; i2=" + i2);
// Send message to content script with the query value
chrome.tabs.sendMessage(tabid, {x: 'val-x', y: data[i2].data[i].val-y}, function(response) {
console.log("RECEIVING: i=" + i + "; i2=" + i2);
console.log("RECEIVING: val1=" + response.value1+ "; val2=" + response.value2);
// ANOTHER FUNCTION CALL
dothis(response.value1, response.value2, response.value3);
});
因此,在loop1中,这些函数被调用。然后,在有机会返回值之前,他们再次通过loop2调用。一个选项是使您的
函数(响应)
递归。当它运行时,再次调用相同的方法。传入一些“循环”变量,并在开始时进行if检查
function AnotherGoRound(i,data) {
if (i<data[i2].data.length) {
console.log("SENDING: i=" + i + "; i2=" + i2);
// Send message to content script with the query value
chrome.tabs.sendMessage(tabid, {x: 'val-x', y: data[i2].data[i].val-y}, function(response) {
console.log("RECEIVING: i=" + i + "; i2=" + i2);
console.log("RECEIVING: val1=" + response.value1+ "; val2=" + response.value2);
// ANOTHER FUNCTION CALL
dothis(response.value1, response.value2, response.value3);
AnotherGoRound(i + 1, data);
});
}
}
AnotherGoRound(0, data);
函数另一个循环(i,数据){
如果(i)你能用“loop2”来澄清你指的是什么吗?尽我所能,我在顶部示例中看到了一个原始循环,但我没有看到另一个…?您能否提供一些示例数据,说明数据如何受到错误影响?@DavidW我只是指第二次迭代。不是另一个循环。以下是数据如何受到影响:迭代1发送消息(带有一些参数)到内容脚本。获取此消息时,内容脚本会将它们传递到function1和Function2。但是,当这两个函数仍在运行时,迭代2(从应用程序页面)会启动并使用新值再次调用这些函数。因此,我会在第一次迭代中返回空值,而只在第二次迭代中返回值(即最后一次迭代,因为它现在只设置为循环两次)嗯……在使用结果之前,有没有办法让函数1和函数2成为从回调调用的闭包的一部分?我认为这会延迟执行。我在另一篇文章中看到,有人在异步chrome选项卡消息处理和使用闭包方面遇到了问题。可能有用,也可能没用,所以看一看:不,工作不太好:(我检查了我的控制台日志,在我得到I=0的返回值之前,发送:I=0和发送:I=1会被记录下来(即在接收:I=0之前发送:I=1的日志)…所以基本上它意味着,迭代1,它发送值,而不是等待它在继续迭代2之前返回值。(虽然脚本现在正在运行,因为它似乎延迟了足够多的时间来从两次迭代中获取数据,但问题仍然没有得到解决)。这会起作用,但如果您想利用同步消息,这并不是最佳选择。有一些方法可以使它更快。@Mike此代码唯一可能发生的情况是,如果您多次调用另一个另一个
。您应该只调用一次,使用另一个另一个<另一个>(0,数据)
@rsanschez你是对的。我确实调用了它两次,因为我必须在外部声明它。我不明白如何在另一个函数中没有'function'关键字的情况下直接这样声明一个函数。我尝试了上面的方法,它给出了一个'unexpected{'错误。.我还尝试了var functionholder=functionnothergoround(I){}..但是得到了同样的错误。你能确切地告诉我我如何才能做到这一点吗?@MikeHall我编辑了答案。你首先用函数
关键字声明你的函数,然后调用它。
function AnotherGoRound(i,data) {
if (i<data[i2].data.length) {
console.log("SENDING: i=" + i + "; i2=" + i2);
// Send message to content script with the query value
chrome.tabs.sendMessage(tabid, {x: 'val-x', y: data[i2].data[i].val-y}, function(response) {
console.log("RECEIVING: i=" + i + "; i2=" + i2);
console.log("RECEIVING: val1=" + response.value1+ "; val2=" + response.value2);
// ANOTHER FUNCTION CALL
dothis(response.value1, response.value2, response.value3);
AnotherGoRound(i + 1, data);
});
}
}
AnotherGoRound(0, data);