动态链接/分层的承诺

时间:2019-01-17 16:53:02

标签: javascript ecmascript-6 es6-promise

如何有数量可观的诺言按顺序解决?就像在其中一样,在完成操作之前先等待它。

从本质上讲,我希望它们被同步调用,但我在我的环境中不能使用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();

1 个答案:

答案 0 :(得分:2)

您非常亲密。您的循环计数器中只有一个错误。更改此:

for(i=1; i<5; i++){

对此:

for(let i=1; i<5; i++){

使用您现有的代码,i被隐式地设置为全局var。您的代码循环遍历,设置了Promise链。然后,当诺言开始解决时,i现在为5,因此除第一个诺言外,所有其他诺言最终都使用5代替了预期数字。

如果您改为使用let,则每次循环时都会有一个新的变量绑定。因此,每次调用MyClass(i)都会看到自己的正确号码。