gpt4 book ai didi

javascript - 试图让异步代码在for循环内同步运行

转载 作者:行者123 更新时间:2023-11-30 17:14:27 31 4
gpt4 key购买 nike

我有一个函数 runSyncForLoop,我希望 2 秒超时可以阻止 openEmailPage 作为 linkArray 被连续调用大约 30 次 被循环。我这样做是基于我正在阅读的其他一些 stackoverflow 帖子,其中一篇建议使用 deasync,另一篇建议使用 sync。我认为我遇到的问题是 ret 是异步设置的,所以这不能解决问题。现在,有一个暂停,然后 openEmailPage 突然被触发了 30 次,尽管我预计每次触发之间会有两秒的延迟。

function runSyncForLoop(linkArray){
for (i in linkArray) {
var ret = 0 ;
setTimeout(function(){
openEmailPage(linkArray[i])
},2000);
ret="hello";
}
while(ret === 0) {
require('deasync').runLoopOnce();
}
return ret;
}

如果没有 deasync/timeout 的东西,这可能只是以下内容:

function runSyncForLoop(linkArray){
for (i in linkArray) {
openEmailPage(linkArray[i])
}
}

我想弄清楚如何在每次调用 openEmailPage(linkArray[i])

之间延迟两秒来运行它

最佳答案

setTimeout() 是异步的,因此它所做的只是启动一个计时器,而您的 for 循环会继续运行。因此,您最终设置了 30 个几乎同时响起的计时器。

相反,您需要运行您的函数,设置一个两秒的计时器,当该计时器触发时,再次运行您的函数。这是一种方法:

function runEmailLoop(linkArray) {
var cntr = 0;

function run() {
if (cntr < linkArray.length) {
openEmailPage(linkArray[cntr]);
++cntr;
setTimeout(run, 2000);
}
}
// run first iteration immediately, then each one two seconds after that
run();
}

如果您希望对 openEmailPage() 的第一次调用也等待两秒钟,您可以这样更改:

function runEmailLoop(linkArray) {
var cntr = 0;

function run() {
if (cntr < linkArray.length) {
openEmailPage(linkArray[cntr]);
++cntr;
setTimeout(run, 2000);
}
}
// run first iteration in 2 seconds
setTimeout(run, 2000);
}

关于javascript - 试图让异步代码在for循环内同步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26389146/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com