如何在迭代到下一个索引之前运行整个函数 (JavaScript)

How to run a whole function before iterating to the next index (JavaScript)

提问人:Help Me Nothing 提问时间:12/29/2018 更新时间:12/29/2018 访问量:109

问:

我正在尝试运行一个函数,在该函数中打开一个 url 的新窗口并在 1.5 秒后关闭新窗口。我正在尝试循环并执行此 3 次。但是,代码会同时打开所有三个新窗口,然后执行超时。我希望下一个窗口仅在前一个窗口关闭后打开。

function test(url){
  let a = window.open(url);
  a.focus();
  setTimeout(()=>{
    a.close();
  }, 1500);
};

const repl = 'mysite.com';

for(let i = 0; i < 3; i++){
  test(repl);
}
JavaScript 循环 异步 闭包

评论

1赞 user2864740 12/29/2018
例如,在超时使用回调来“做其他事情”。.然后使用该回调来链接调用(例如,调用下一个函数),而不是循环。或者,请参阅承诺等。function test(url, onClosed) { ... setTimeout(() => { a.close(); onClosed(); } }test

答:

1赞 iagowp 12/29/2018 #1

如果您希望一个在另一个之后运行,当另一个完成后,调用下一个。例如,像这样的东西

const reps = 3;
let i = 0;
function test(url){
  let a = window.open(url);
  a.focus();
  setTimeout(()=>{
    a.close();
    i++;
    if (i < 3) {
      test(url);
    }
  }, 1500);
};

const repl = 'mysite.com';
test(repl);

评论

0赞 Help Me Nothing 12/29/2018
有没有办法使用 For 循环语法,或者我最好检查一下 Async / Await、Promise 或 Callbacks?无论如何,很棒的代码!这行得通 💖
0赞 Taplar 12/29/2018
for 循环与处理异步逻辑不兼容。@GodComplex
0赞 iagowp 12/29/2018
@GodComplex 如果您位于异步函数中,并且您的函数返回了 promise,则可以使用 for 循环语法。因此,当这个承诺得到解决时,你就会进入下一个迭代
0赞 Lennholm 12/29/2018
@Taplar 这是在使用 时,所以@GodComplex是的,强烈建议您查看async-awaitasync-await
-1赞 Amit Chowdhury 12/29/2018 #2

您可以使用异步库,在那里您可以找到许多方法,例如 foreach,every。您可以串联和并行执行任务以同步运行任务,您可以使用限制为 1 的 foreachlimit,其中将首先完成单个任务,然后开始下一次迭代。

评论

0赞 stealththeninja 12/29/2018
你有例子吗?为什么这里需要图书馆或图书馆是有益的?