Bluebird — как пораньше разорвать цепочку обещаний

PromiseA().then(function(dataA){
    if (dataA.foo == "skip me")
        return ?? //break promise early - don't perform next then()
    else
        return PromiseB()
}).then(function(dataB){
    console.log(dataB)
}).catch(function (e) {
    //Optimal solution will not cause this method to be invoked
})

Как можно изменить приведенный выше код, чтобы он прерывался раньше (пропустить 2-й затем())?


person Jonah    schedule 09.05.2016    source источник
comment
return Promise.reject (новая ошибка (пожалуйста, поймайте меня))   -  person Yerken    schedule 09.05.2016
comment
Или лучше throw new Error("please catch me");. Это похоже на дубликат.   -  person Shanoor    schedule 09.05.2016
comment
Но в этом случае вызывается функция catch(), чего я не хочу.   -  person Jonah    schedule 09.05.2016
comment
См. stackoverflow.com/questions/28803287/ как-нарушить-цепочку-обещаний/ Используйте return { then: function() {} };   -  person Martin    schedule 27.07.2017


Ответы (1)


Bluebird позволяет отменить обещание:

var Promise = require('bluebird');
Promise.config({
    // Enable cancellation
    cancellation: true,
});

// store the promise
var p = PromiseA().then(function(dataA){
    if (dataA.foo == "skip me")
        p.cancel(); // cancel it when needed
    else
        return PromiseB();
}).then(function(dataB){
    console.log(dataB);
}).catch(function (e) {
    //Optimal solution will not cause this method to be invoked
});
person Shanoor    schedule 09.05.2016
comment
Разве p не нужно определять перед вызовом? Когда p впервые вызывается здесь, похоже, что он еще не определен. - person Jonah; 09.05.2016
comment
@Jonah Мы находимся в асинхронной среде, функция не выполняется сразу (она выполняется на следующем тике), к тому времени, когда она выполняется, p определяется. - person Shanoor; 09.05.2016
comment
не установлено ли p значение этого последнего оператора в цепочке - catch в данном случае? Однако перехват не выполняется до тех пор, пока не будет вызван p.cancel(). - person Jonah; 09.05.2016
comment
Методы промисов всегда будут синхронно возвращать одно и то же обещание, чтобы гарантировать, что вы можете продолжить цепочку с другими методами. поэтому значение цепного вызова всегда одно и то же обещание. Пример const p = Promise.then(...).then(); возвращает обещание. и тогда вы можете сделать: p.then(...).catch(...); - person SimoAmi; 26.01.2017