我有这个类,它的方法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/