javascript - 按顺序遍历未确定数量的 Promise

标签 javascript ecmascript-6 promise bluebird q

我有这个类,它的方法next返回一个Promise

class PromiseGenerator {
    constructor() {
        this.limit = 100;
        this.counter = 0;
    }
    next() {
        this.counter++;
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(this.counter <= this.limit ? this.counter : false);
            }, 500);
        });
    }
}

虽然示例显示100,但它可以返回无限数量的 promise 。

我需要按顺序执行所有 promise 。

我怎样才能实现它?

到目前为止我想到的唯一解决方案是递归:

const source = new PromiseGenerator();

(function loop() {
    source.next().then(counter => {
        if (counter) {
            console.log(counter);
            loop();
        } else {
            console.log('Done');
        }
    });
})();

据我目前的理解Node does not optimize tail calls这可能会导致堆栈增长。

有更好的方法吗?

如果某个 Promise 库有它,它就可以工作,但最好了解如何在没有库的情况下实现它。

更新1:抱歉,我没有立即说清楚:我无法控制PromiseGenerator类,它是我可以使用但无法更改的东西。所以问题是如何处理这种情况。

更新 2: 我采用了 @eikooc 解决方案:没有 generators,但只有 async/await。请参阅下面的示例。

谢谢!

最佳答案

Generators是完美的搭配。使用 function* 关键字构造一个生成器:

function* promiseGenerator() {
  while(!someCondition) {
    yield new Promise((resolve, reject) => {})
  }
}

然后用以下方式调用它:

const source = promiseGenerator()
source.next()

这将继续为您带来新的值(value)观。返回看起来像这样 {value: Promise, done: false} 直到完成。 当生成器完成时,done 值将更改为 true

如果您想继续使用该类并且只想一个循环。您还可以将您的类(class)与 async function 结合起来。 :

async function loop() {
  const source = new PromiseGenerator()
  while (true) {
    const result = await source.next()
    if (result) {
      console.log(result)
    } else {
      console.log('done')
      break
    }
  }
}

loop()

关于javascript - 按顺序遍历未确定数量的 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47280297/

相关文章:

javascript - 如何在 HTML 中显示 javascript 代码

javascript - 使用PHP和JavaScript的幻灯片放映

javascript - 如何让用JS输入的数字不溢出容器而是跳到下一行?

javascript - ajax promise 数据未定义

javascript - 检测 Angular JavaScript promise 链中是否存在下一个处理程序

javascript - 使用 Physi.js 进行玩家运动/物理

javascript - 仅更改 JavaScript map 的一个实例

javascript - ES6 中的二维数组

javascript - 将函数作为参数传递并调用它 javascript

javascript - IndexedDB:升级 promise ?