当前位置: 首页 > 编程笔记 >

JavaScript 异步等待循环

安承教
2023-03-14
本文向大家介绍JavaScript 异步等待循环,包括了JavaScript 异步等待循环的使用技巧和注意事项,需要的朋友参考一下

示例

在循环中使用异步等待时,您可能会遇到其中一些问题。

如果您只是尝试在内部使用await forEach,则会抛出Unexpected token错误。

(async() => {
 data = [1, 2, 3, 4, 5];
 data.forEach(e => {
   const i = await somePromiseFn(e);
   console.log(i);
 });
})();

这是因为您错误地将箭头功能视为一个块。该await会在回调函数,这是不是上下文async。
解释器可以防止我们发生上述错误,但是如果您将其添加async到forEach回调中,则不会引发任何错误。您可能会认为这可以解决问题,但无法按预期工作。

例:

(async() => {
  data = [1, 2, 3, 4, 5];
  data.forEach(async(e) => {
    const i = await somePromiseFn(e);
    console.log(i);
  });
  console.log('this will print first');
})();

发生这种情况是因为回调异步函数只能暂停自身,而不能暂停父异步函数。

您可以编写一个asyncForEach函数,该函数返回一个Promise,然后您可以执行以下操作:基本上,您返回一个Promise,它在等待和完成所有回调时解析。但是有更好的方法可以做到这一点,那就是使用循环。await asyncForEach(async (e) => await somePromiseFn(e), data )

您可以使用一个for-of循环for/while,也可以使用一个循环,选择哪一个并不重要。

(async() => {
  data = [1, 2, 3, 4, 5];
  for (let e of data) {
    const i = await somePromiseFn(e);
    console.log(i);
  }
  console.log('this will print last');
})();

但是还有另一个问题。该解决方案将等待每个调用somePromiseFn完成,然后再进行下一个调用。
如果您实际上希望somePromiseFn按顺序执行调用,那么这很好,但是如果您希望它们并发运行,则需要awaiton Promise.all。

(async() => {
 data = [1, 2, 3, 4, 5];
 const p = await Promise.all(data.map(async(e) => await somePromiseFn(e)));
 console.log(...p);
})();

Promise.all接收一个promises数组作为其唯一参数,并返回一个promise。当数组中的所有promise被解析后,返回的promise也将被解析。我们await信守这一诺言,当它成为现实时,我们所有的价值观都可以实现。

上面的示例是完全可运行的。该somePromiseFn函数可以作为具有超时的异步回显函数使用。您可以尝试至少使用stage-3预设的babel-repl中的示例,并查看输出。

function somePromiseFn(n) {
 return new Promise((res, rej) => {
   setTimeout(() => res(n), 250);
 });
}
           

 类似资料:
  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 问题内容: 在循环中使用/ 是否有任何问题?我试图遍历文件数组和每个文件的内容。 这段代码确实有效,但是这可能会出问题吗?我让某人告诉我,您不应该在这样的高阶函数中使用/ ,所以我只是想问一下这是否有问题。 问题答案: 确保代码确实有效,但是我很确定它不会实现您期望的功能。它只会触发多个异步调用,但此后函数会立即返回。 顺序阅读 如果要顺序读取文件, 则不能使用。只需使用现代循环即可,该循环将按预

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 我试图理解为什么这段代码返回“Promise{pending}”。 当我通过reduceDirections()函数时,我可以看到我得到了想要的结果。但是当我(一行之后)时,我会改为“Promise pending” 很抱歉,我不理解promise和异步等待。我曾尝试在mdn上阅读和观看视频,但我不知道如何将它们显示的内容转移到这个问题上。提前感谢您的帮助!

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?

  • 问题内容: 我使用Node.js和TypeScript,并且使用。这是我的测试用例: 我想为整个功能设置一个超时时间。即如果要花费2秒,花费0.5秒,花费5秒,我想在3秒钟后让我抛出错误的超时。 正常调用是一个问题,因为范围丢失了: 而且我不能用普通的方式抓住它: 有关如何解决的任何想法? 问题答案: 您可以使用超时: 您必须将其包装在诺言中才能使用。