如何有数量可观的诺言按顺序解决?就像在其中一样,在完成操作之前先等待它。
从本质上讲,我希望它们被同步调用,但我在我的环境中不能使用await / async
到目前为止,这是我尝试过的方法,但仅在第一个和最后一个被调用时有效:
class MyClass{
constructor(t){
this.time = t
}
load(){
return new Promise(resolve => {
setTimeout( () => {
console.log(this.time);
resolve(this.time);
}, 1000/this.time)
})
}
}
let pChain;
for(i=1; i<5; i++){
if(!pChain){
pChain = new MyClass(i).load();
}else{
pChain = pChain.then( t => new MyClass(i).load())
}
}
pChain.then();
答案 0 :(得分:2)
您非常亲密。您的循环计数器中只有一个错误。更改此:
for(i=1; i<5; i++){
对此:
for(let i=1; i<5; i++){
使用您现有的代码,i
被隐式地设置为全局var
。您的代码循环遍历,设置了Promise链。然后,当诺言开始解决时,i
现在为5,因此除第一个诺言外,所有其他诺言最终都使用5代替了预期数字。
如果您改为使用let
,则每次循环时都会有一个新的变量绑定。因此,每次调用MyClass(i)都会看到自己的正确号码。