进行多个异步验证而无需嵌套

时间:2018-07-25 03:58:14

标签: angular promise

我经常遇到一些用例,在这些用例中,我必须先执行几次异步验证,然后才能执行任务。例如,doValidationX()返回一个Promise,如果验证成功,该Promise将成功,否则将失败。以下是我目前如何处理此类案件。

this.doValidation1(object).then(() => {
   this.doValidation2(object).then(() => {
       this.doValidation3(object).then(() => {
           this.doValidation4(object).then(() => {
               this.doValidation5(object).then(() => {
                    //Do something.
               }).catch(reason => console.log(reason));
           }).catch(reason => console.log(reason));
       }).catch(reason => console.log(reason));
   }).catch(reason => console.log(reason));
}).catch(reason => console.log(reason));

由于嵌套,它非常不可读。有没有办法避免嵌套和以更易读的方式组织此代码?我尝试使用Promise.all(),但很快意识到如果我这样做,所有验证都可以立即运行。如果第一次验证成功,我只想运行第二次验证。

2 个答案:

答案 0 :(得分:0)

It was quite simpler than I thought. Thanks @jfriend00 for pointing me the right direction.

this.doValidation1(object)
    .then(() => this.doValidation2(object))
    .then(() => this.doValidation3(object))
    .then(() => this.doValidation4(object))
    .then(() => this.doValidation5(object))
    .then(() => {
        //Do something
    }));

答案 1 :(得分:0)

实际上,这种方法可能不是最佳方法。您的验证似乎是独立的,但是您正在等待每个验证完成,直到下一次验证触发。这会导致不必要的空闲时间:例如,您的验证需要1秒钟-例如,您的代码将花费5秒钟来运行。如果您可以并行运行promise(因此仅等待一秒钟),则不需要此设置。

One way to do so is to use Promise.all(),它并行运行一个promise数组,并在所有promise成功解析后解析为true,否则拒绝:

Promise.all([
  this.doValidation1(object),
  this.doValidation2(object),
  this.doValidation3(object),
  this.doValidation4(object),
  this.doValidation5(object),
]).then(() => {
  //validation passed
}).catch((e) => {
  // validation failed.
});

但是,当承诺不是独立的(您需要第二个承诺的结果,等等)时,您的方法是正确的。