Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.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_Jquery_Loops_Google Chrome Extension_Synchronization - Fatal编程技术网

Javascript 如何使循环中的函数同步运行?

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

我正在开发一个chrome插件,需要从“应用程序页面”向“内容脚本”发送消息,然后从循环中获取返回消息。但是,由于循环在开始下一次迭代之前不会等待sendMessage返回值,因此它会将返回值搞砸。下面是代码的示例:

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);