gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:45:27 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com