场景
- 如果我们在 promise 的链式调用中,当中间一步完成后的结果不足以支撑后续的操作,这时候我们可能想在此处终止 promise 链的后续操作,那该如何做呢?
正常的链式调用
let p = new Promise((resolve, reject) => {
resolve('step1');
});
p.then(data => {
console.log(data);
return 'step2';
}).then(data => {
console.log(data);
return 'step3';
}).then(data => {
console.log(data);
return 'step4';
}).catch(reason => {
console.log(reason);
}).finally(() => {
console.log('finished');
});
返回结果
step1
step2
step3
finished // 犹如 step 后续没有的 then 操作,所以 step4 没有打印
但是,如果我们在处理step2的时候,因为条件满足了,后面的步骤不需要执行了,这时候就需要去中断后续的调用链。
方法 1
let p = new Promise((resolve, reject) => {
resolve('step1');
});
p.then(data => {
console.log(data);
return 'step2';
}).then(data => {
console.log(data);
throw 'break'
return 'step3';
}).then(data => {
console.log(data);
return 'step4';
}).catch(reason => {
console.log('catch:'+reason);
}).finally(() => {
console.log('finished.');
});
返回结果:
step1
step2
catch:break
finished
方法 2
let p = new Promise((resolve, reject) => {
resolve('step1');
});
p.then(data => {
console.log(data);
return 'step2';
}).then(data => {
console.log(data);
return Promise.reject('break')
}).then(data => {
console.log(data);
return 'step4';
}).catch(reason => {
console.log('catch:'+reason);
}).finally(() => {
console.log('finished.');
});
返回结果:
step1
step2
catch:break
finished
如果有更好方法的小伙伴可以留言讨论