2015-12-16 6 views
3

Я хочу убедиться, что я не пропущу трюк; в библиотеке Kris Коваля, вы можете сделать следующее в качестве общего заявления на вылов в обещаниях:jQuery Отложенный - catch vs fail

var a, b, c, d, e, f; 

readFile('fileA') 
    .then(function (res) { 
     a = res; 

     return readFile('fileB'); 
    }) 
    .then(function (res) { 
     b = res; 

     return readFile('fileC'); 
    }) 
    .then(function (res) { 
     c = res; 

     return readFile('fileD'); 
    }) 
    .then(function (res) { 
     d = res; 

     return readFile('fileE'); 
    }) 
    .then(function (res) { 
     e = res; 

     return readFile('fileF'); 
    }) 
    .then(function() { 
     f = res; 
    }) 
    .catch(function() { 
     // error happened in file read *somewhere* (don't care where) 
    }); 

В отсроченных объектах JQuery, есть не catch заявления, вместо этого, я должен сделать это:

var a, b, c, d, e, f; 

readFile('fileA') 
    .then(function (res) { 
     a = res; 

     return readFile('fileB'); 
    }) 
    .fail(function() { 
     // error happened in file read *somewhere* (don't care where) 
    }) 
    .then(function (res) { 
     b = res; 

     return readFile('fileC'); 
    }) 
    .fail(function() { 
     // error happened in file read *somewhere* (don't care where) 
    }) 
    .then(function (res) { 
     c = res; 

     return readFile('fileD'); 
    }) 
    .fail(function() { 
     // error happened in file read *somewhere* (don't care where) 
    }) 
    .then(function (res) { 
     d = res; 

     return readFile('fileE'); 
    }) 
    .fail(function() { 
     // error happened in file read *somewhere* (don't care where) 
    }) 
    .then(function (res) { 
     e = res; 

     return readFile('fileF'); 
    }) 
    .fail(function() { 
     // error happened in file read *somewhere* (don't care where) 
    }) 
    .then(function (res) { 
     f = res; 

     return readFile('fileF'); 
    }) 
    .fail(function() { 
     // error happened in file read *somewhere* (don't care where) 
    }); 

К сожалению, каждая ветка then имеет уникальную логику. Я что-то упускаю, или вариация jQuery выше единственного способа достижения эквивалента в библиотеке Kris Kowal q?

+1

ли вам попробуйте цепочку 'then()' и используя единственный '.fail();' в конце? он должен работать. –

+0

Это типичный вопрос для Себастьяна, им все еще не уверен, что вы можете заменить улов неудачей –

+0

@ A.Wolff ах .. Кто Sebastien ..? другой волк ..? ._. –

ответ

3

Предполагая, что readFile возвращает объект обещания, Вы действительно можете загрузить все файлы асинхронно с помощью $.when() (в курсе, если вы не заботитесь о том порядке, в котором файлы считываются):

Из документов:

в случае, когда несколько будущих периодов объекты передаются в jQuery.when(), метод возвращает обещание от нового «хозяина» Отложенный объект, который отслеживает совокупное состояние всех Deferreds оно было передано. Метод разрешит своего хозяина Отсрочить, как только все Отложенные решения будут разрешены, или отклонить мастер Отсроченный, как только один из Отложенных будет отклонен. Если мастер Deferred разрешен, выполняются завершенные транзакции для мастера Deferred. Аргументы, передаваемые в doneCallbacks обеспечивают разрешенные значения для каждого из Deferreds и соответствует порядку в Deferreds были переданы jQuery.when()

(курсив мой)

$.when(readFile('fileA'), readFile('fileB'), readFile('fileC'), readFile('fileD'), readFile('fileE'), readFile('fileF')) 
.then(function(a, b, c, d, e, f) { 
    // big success 
},function() { 
    // error happened in file read *somewhere* (don't care where) 
}); 
+0

Выполняйте их параллельно, а не последовательный порядок. –

+0

Посмотрите на свою документацию, я, безусловно, могу сделать '$ .when (readFile ('fileA'), readFile ('fileB'), ..., readFile ('fileF')). затем (function (a, b, ..., f) {...}); 'где' a, b, ..., f' - это содержимое файлов? – keldar

+0

@keldar да, обновленный ответ для наглядности. обратите внимание, что ваш метод readFile должен возвращать объект с отсрочкой. –