2015-12-14 1 views
1

То, что я хочу сделатьУсловные тогда обещания (Блюбердо)

getFoo() 
    .then(doA) 
    .then(doB) 
    .if(ifC, doC) 
    .else(doElse) 

Я думаю, что код довольно очевиден? Во всяком случае:

Я хочу выполнить обещание, когда дается конкретное условие (также обещание). Я мог бы, вероятно, сделать что-то вроде

getFoo() 
    .then(doA) 
    .then(doB) 
    .then(function(){ 
    ifC().then(function(res){ 
    if(res) return doC(); 
    else return doElse(); 
    }); 

Но это выглядит довольно многословным.

Я использую bluebird как библиотеку обещаний. Но я думаю, что если что-то в этом роде будет одинаковым в любой библиотеке обещаний.

ответ

4

Вам не нужно иметь вложенные .then вызов, так как кажется, как ifC возвращает Promise в любом случае:

getFoo() 
    .then(doA) 
    .then(doB) 
    .then(ifC) 
    .then(function(res) { 
    if (res) return doC(); 
    else return doElse(); 
    }); 

Вы также могли бы сделать некоторую беготню фронта:

function myIf(condition, ifFn, elseFn) { 
    return function() { 
    if (condition.apply(null, arguments)) 
     return ifFn(); 
    else 
     return elseFn(); 
    } 
} 

getFoo() 
    .then(doA) 
    .then(doB) 
    .then(ifC) 
    .then(myIf(function(res) { 
     return !!res; 
    }, doC, doElse)); 
2

Я думаю, вы ищете что-то вроде this

Пример с вашим кодом:

getFoo() 
    .then(doA) 
    .then(doB) 
    .then(condition ? doC() : doElse()); 

Элементы в состоянии должны быть определены до начала цепи.

0

на основе this other question, вот что я придумал для опционального тогда:

Примечания: если ваша функция условия действительно должна быть обещанием, посмотрите на @ TbWill4321 отвечает

ответ для опциональногоthen()

getFoo() 
    .then(doA) 
    .then(doB) 
    .then((b) => { ifC(b) ? doC(b) : Promise.resolve(b) }) // to be able to skip doC() 
    .then(doElse) // doElse will run if all the previous resolves 

улучшенного ответ е ром @jacksmirk для условногоthen()

getFoo() 
    .then(doA) 
    .then(doB) 
    .then((b) => { ifC(b) ? doC(b) : doElse(b) }); // will execute either doC() or doElse() 

EDIT: Я предлагаю вам взглянуть на обсуждение Bluebird на имеющие promise.if()HERE

Смежные вопросы