2017-02-21 17 views
1

Я нахожусь в следующей ситуации. Мне нужно сделать 3 асинхронных вызова: call2 срабатывает только тогда, когда call1 завершен, а call3 срабатывает только при выполнении вызова2 (мне также нужно использовать отложенный объект из jQuery).jQuery отложен: создать цепочку с использованием условий

function call1() { 
    return $.ajax(...); 
} 

function call2() { 
    return $.ajax(...); 
} 

function call3() { 
    return $.ajax(...); 
} 

Ничего сложного на данный момент, я мог бы просто использовать функцию then().

call1().then(call2).then(call3) 

Проблема состоит в том, что есть 2 условия (cond2 и cond3), который будет определять, является ли вызов 2 и call3 будут сделаны. Если бы я, чтобы описать его с помощью псевдокода она будет выглядеть следующим образом:

if cond2 
    if cond3 
    call1().then(call2).then(call3) 
    else 
    call1().then(call2) 
else 
    if cond3 
    call1().then(call3) 
    else 
    call1() 

Я знаю, что я могу решить мою проблему, написав программу, которая использует эту структуру, но он просто не кажется правильным.

Мой вопрос: как бы вы решили это эффективно, используя отложенный объект из jQuery? Спасибо заранее!

+1

Что такое проблема с шаблоном 'if..else'? – guest271314

+0

Значения условия известны в начале, или их результат зависит от асинхронных результатов? – trincot

+0

Значения состояния известны с самого начала. – five

ответ

2

Это может быть то, что вы ищете:

var chain = call1(); 
if (cond2) chain = chain.then(call2); 
if (cond3) chain = chain.then(call3); 
return chain; 
+0

Кажется приятным и простым и понятным. Я попытался сделать что-то более изящным и продолжал возвращаться к этому как хороший способ пойти. – jfriend00

2

Вы можете сделать это в качестве альтернативы:

call1().then(cond2 ? call2 : null).then(cond3 ? call3 : null); 

Не-функция null сделает обещанное значение, которое будет возвращено, так следующий then обратный вызов в цепочке по-прежнему получит обещанное значение.

+0

Вам даже не нужно 'noop', вы можете просто передать« null »или что-то, что не является функцией. – Bergi

+0

Спасибо, @Bergi, обновил его. – trincot