如何同步Promise对象?

Bur*_*soy 5 javascript promise ecmascript-2017

我有承诺需要同步的对象.例如,第二个承诺在第一个承诺完成之前不应该起作用.如果第一个拒绝,则必须再次执行.

我已经实现了一些例子.这个很好用.调用getVal,等待2000ms,返回,i ++,再次调用getVal .....

 getVal() {
       return new Promise(function(resolve, reject) {
      setTimeout(function(){ resolve(19) }, 2000);
         });

     }

async promiseController(){

    for(var i =0;i<5;i++)
      {
        var _val = await this.getVal()
        console.log(_val+'prom');
      }
    }
Run Code Online (Sandbox Code Playgroud)

但我需要控制一组promise对象.我想要做的是我有一个数据,我把它分成5块.在处理完第一部分(例如:发送到服务器)后,我想要处理第二部分,否则我必须再次处理第一部分.

这是我制作的原型实现

  getVal() {
   return new Promise(function(resolve, reject) {
  setTimeout(function(){ resolve(19) }, 2000);
     });

 }

async promiseController(){
  var proms=[]
  for(var i =0;i<5;i++)
    {
      proms.push(this.getVal())
    }

for(var i =0;i<5;i++)
  {
    var _val = await proms[i]
    console.log(_val+'prom');
  }
}
Run Code Online (Sandbox Code Playgroud)

此代码中的Promises对象按顺序工作.我如何修复下面的代码,以便它作为第一个例子同步工作.

Ben*_*aum 3

async promiseController(){
  for(const value of array) {
    console.log((await this.getVal(value))+'prom');
  }
}
Run Code Online (Sandbox Code Playgroud)

没必要把事情搞得太复杂。只需await在循环内调用,它就会等待您想要的内容。

正如另一个答案正确地说的那样 - 承诺代表一种价值而不是一种操作。对于操作,使用常规函数。

如果你想忽略失败,你可以.catch(() => {})兑现承诺。如果您想重试直到失败 - 您可以将重试重构为函数并使用它:

const retry = fn => (...args) => fn(...args).catch(retry(fn));
Run Code Online (Sandbox Code Playgroud)