在Node.js,es6中,如何使循环等待异步进程?

时间:2017-08-28 09:34:36

标签: 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);
      });
  });

});
}

2 个答案:

答案 0 :(得分:1)

将异步调用放在循环中是一种不好的做法。你有两种方法可以解决这个问题。

1 - 您希望并行调用函数

使用 Promise.all 。例如:

const rets = await Promise.all(this.lessons.levels.map(...));

2 - 您希望一个接一个地调用这些函数

this stackoverflow post内的示例。

答案 1 :(得分:0)

您可以使用Bluebird的{​​{1}}。这等待你的承诺在运行下一次迭代之前返回

Promise.each