javascript - 在 Node.js、es6 中,如何让循环等待异步进程?

标签 javascript node.js asynchronous async.js

我知道js中的循环不会等待异步过程,因此,当异步过程完成时,循环将始终处于最后一次迭代。

我的问题是,如何解决这个问题,以便我可以让 for 循环等待循环的每次迭代?

getChildItems() {
return new Promise((resolve, reject) => {

  this.lessons.levels.map((item, i) => {

      item.childlevels.map((childItem, iChild) => {

        ((i, iChild) => {
        this.horseman
        .open(childItem.url)
        .html()
        .then((html) => {
          cheerio(html).find('.list-item a').map((index, elem) => {
            let lesson = cheerio(elem);
            childItem.lessons.push(
              {name: lesson.text(), url: lesson.attr('href')}
            );
          });
        })
        .then(() => {
          const outter = i >= this.lessons.levels.length - 1;
          const inner = iChild >= item.childlevels.length - 1;

          if (outter && inner) {
            resolve(this.lessons);
          }
        });
      })(i, iChild);
      });
  });

});
}

最佳答案

将异步调用放入循环中是一种不好的做法。您有两种方法来处理这个问题。

<小时/>

1 - 您希望并行调用函数

使用Promise.all。例如:

const rets = await Promise.all(this.lessons.levels.map(...));
<小时/>

2 - 您希望函数被依次调用

this stackoverflow post内的示例.

关于javascript - 在 Node.js、es6 中,如何让循环等待异步进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45915914/

相关文章:

android - 如何添加线程?

javascript - 异步嵌入脚本后是否需要使用 window.onReady()?

php - 为特定字符之前和之后的文本字符串着色

javascript - 如何在 ES6 模板字符串中使用颜色?

python - 如何在同步上编写高阶生成器泛型?

javascript - require 未在生产构建中定义 (react.production.min.js)

node.js - Next.js - 图像不是 'defined"

javascript - 如何在 nuxt.config.js 中扩展 webpack > config > externals?

javascript - Node js - 使用 node-forge 作为跨平台应用程序获取证书指纹

javascript - 我可以在 Javascript 中使用变量进行 'if' 查询吗?