bluebird如何跳出promise chain
发布于 1个月前 作者 lonso 305 次浏览 来自 问答

直接代码

    return new Promise(function(resolve,reject){
        PromiseA().then(function(dataA){
            if (dataA)
                return resolve()
            else
                return PromiseB()
        }).then(function(dataB){
            console.log(dataB)
        })
    })

本以为是dataA处应该跳出这个promise,但是即使在dataAreturn之后 dataB处仍然可以执行. 有没有直接跳出的方式?

目前写法

    return new Promise(function(resolve,reject){
        PromiseA().then(function(dataA){
            if (dataA)
                throw resolve()
            else
                return PromiseB()
        }).then(function(dataB){
            console.log(dataB)
        })
    })
8 回复

在then里面return本来就是会传到下一个then。不要下面一段不就好了,既然没有关系。

@coolicer 这个只是例子,就是下面那段有关系.后面还有很多. 只是有些情况会在dataA处跳出.

@eeandrew 难道没有更温柔的方法, 这样处理,catch会收到这个错误.

@lonso 你的写法有问题。

第一步 剥去外面那层Promise

return PromiseA().then(function(dataA){
            if (dataA)
                throw resolve()
            else
                return PromiseB()
        }).then(function(dataB){
            console.log(dataB)
        })

第二步 参考下面的代码更改你的catch逻辑

var Promise = require("bluebird");

//等同于promiseA
var promiseA = Promise.try(function(){return 'dataA'});

//等同于 PromiseA().then
var promiseB = promiseA.cancellable()
    .then(function(dataA){
        if(dataA === 'dataA'){
            return promiseA.cancel("dataA"); 
        }else{
            return 'never reach here'
        }
    }).then(function(data){
        return data;
    })

//通过ErrorType来区别对待异常    
promiseB.then(console.log)
    .catch(Promise.CancellationError,function(e){
        console.log(e);
    })
    .catch(function(e){
        console.log('other error')
    })

还有一种:

var Promise = require("bluebird");

//等同于promiseA
var promiseA = Promise.try(function(){return 'dataA'});

//等同于 PromiseA().then
var promiseB = promiseA.cancellable()
    .then(function(dataA){
        if(dataA === 'dataA'){
            throw 'dataA'
        }else{
            return 'never reach here'
        }
    }).then(function(data){
        console.log('should not printed')
        return data;
    }).catch(function(e){
        if(e === 'dataA')
        return 'still resolve PromiseB'
        else
        throw e;
    })

//通过ErrorType来区别对待异常    
promiseB.then(console.log)
.catch(function(e){
    console.log('catch error')
});
回到顶部