2016-04-03 8 views
0

1) У меня есть цепь JQuery тогда(), как это:Javascript then() chaining - which Deferred делает второй, а затем() соответствует?

someAjax().then(function(val) { console.log("done 1: " + val); return val + 1; }, 
       function(val) { console.log("fail 1: " + val); return val + 2; }, 
       function(val) { console.log("prog 1: " + val); return val + 3; } 

     ).then(function(val) { console.log("done 2: " + val) }, 
       function(val) { console.log("fail 2: " + val) }, 
       function(val) { console.log("prog 2: " + val) } 
     ) 

Я понимаю, что эти три функции (три Args) по первого затем() соответствуют состояниям отсроченной объекта из someAjax().

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

Я чувствую, что я могу неправильно понять что-то здесь. Оцените любые разъяснения.

////////////////////////////////////////////// //////

2) Я другой цепочки, как это:

$.getJSON(url).then(
       doneFunction1, 
       errorFunction1 
      ).then(
       doneFunction2 
      }); 

doneFunction1 выглядит следующим образом:

function doneFunction1(val){ 
    if(val > 1) 
     return $.ajax(url2); 
} 

так что это не всегда возвращает обещание, как вы см., в зависимости от val. В случае, если он не возвращает Promise (скажем, val < 1), как проходит вторая? Это приведет к ошибке? Потому что, как я понимаю, нет обещания позвонить тогда(). Я предполагаю, что он может просто вызвать then() первого обещания $.getJSON, но я могу ошибаться.

В принципе, я пытаюсь НЕ иметь второй then() вообще, когда `val < 1 '. Является ли это возможным?

+0

это относится к тому, что вы вернетесь из первого .then обещания – JordanHendrix

+0

'.then' обычно занимает всего две функции, первый называется когда обетование разрешится, второе, когда оно отвергнуто? – adeneo

+0

Отмечая, что вы используете jQuery, а не правильные обещания A +, здесь было бы очень важно! – adeneo

ответ

1

Вы можете просто вернуть отложенные, который либо разрешен или отклонен

function doneFunction1(val){ 
    if(val > 1) { 
     return $.ajax(url2); 
    } else { 
     var def = $.Deferred(); 
     return def.reject(); // or def.resolve('something'); to hit the success handler 
    } 
} 

$.getJSON(url).then(
    doneFunction1, 
    errorFunction1 
).then(
    doneFunction2, 
    errorFunction2 // only needed if you want to catch the error 
});