我经常遇到一些用例,在这些用例中,我必须先执行几次异步验证,然后才能执行任务。例如,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()
,但很快意识到如果我这样做,所有验证都可以立即运行。如果第一次验证成功,我只想运行第二次验证。
答案 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.
});
但是,当承诺不是独立的(您需要第二个承诺的结果,等等)时,您的方法是正确的。