【问题标题】:How to run a whole function before iterating to the next index (JavaScript)如何在迭代到下一个索引(JavaScript)之前运行整个函数
【发布时间】:2019-05-26 13:06:33
【问题描述】:

我正在尝试运行一个函数,在该函数中我打开一个新窗口到一个 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);
}

【问题讨论】:

  • 在超时后使用回调来“做其他事情”,例如。 function test(url, onClosed) { ... setTimeout(() =&gt; { a.close(); onClosed(); } }。然后使用该回调链接调用(例如调用下一个test 函数),而不是循环。或者,请参阅 Promises 等。

标签: javascript loops asynchronous closures


【解决方案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);

【讨论】:

  • 有没有办法使用 For 循环语法,或者我最好检查 Async / Await、Promises 或 Callbacks?无论如何,很棒的代码!这有效?
  • for 循环与处理异步逻辑不兼容。 @GodComplex
  • @GodComplex 如果你在异步函数中,你可以使用 for 循环语法,并且你的函数返回了一个 Promise。所以当这个承诺得到解决时,你会进入下一个迭代
  • @Taplar 是在使用async-await 时,所以@GodComplex 是的,强烈推荐查看async-await
【解决方案2】:

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

【讨论】:

  • 你有例子吗?为什么这里需要图书馆或图书馆是有益的?
猜你喜欢
  • 2019-08-23
  • 2023-03-05
  • 2020-08-12
  • 2021-02-15
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多