中断promise的链式调用

963 阅读1分钟

场景

  • 如果我们在 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

如果有更好方法的小伙伴可以留言讨论