Мой проект включает в себя рабочие процессы, в которых используются API-интерфейсы muliple, которые возвращают отложенные обещания. Я использую jQuery 1.8Почему несколько обработчиков «fail» вызывается, когда несколько обработчиков «then» привязаны к отложенному?
Я понимаю, что разница между .done()
и .then()
заключается в том, что .then()
возвращает новое обещание. В моем примере я ожидал бы, что если первый отложенный был отклонен, то только первый обработчик .fail()
будет выполнен, потому что второй привязан к новому обещанию. При выполнении выполняются оба обработчика ошибок.
var firstDeferred = $.Deferred(), secondDeferred = $.Deferred();
firstDeferred.promise()
.fail(function (error) {
console.log(error);
})
.then(function() {
return secondDeferred.promise();
})
.fail(function (error) {
console.log(error);
});
firstDeferred.reject('first deferred object');
//secondDeferred.reject('second deferred object');
Мой Ожидаемый результат:
> first deferred object
Фактический результат:
> first deferred object
> first deferred object
Почему оба .fail()
обработчики называют? Как я могу структурировать свой рабочий процесс так, чтобы обработчики вызывались только тогда, когда отложенные обещания отклонены?
JQuery-х отложено не очень большие перспективы осущ, я рекомендовал бы использовать осущ, который соответствует обещаниям/а + (HTTPS://github.com/promises-aplus/promises-spec/blob/master/implementations.md). Что вы можете сделать в jQuery, является приложением обработчик ошибок, используя метод 'then' (второй параметр, не может быть выполнен с' fail'), и с помощью этой функции вы можете вернуть значение, которое будет передано следующему levelHandler уровня, вы не можете обернуть/изменить ошибку (возможно, в обещаниях/a + impl) или полностью заблокировать ошибку. Обещания должны заканчиваться ошибкой или успехом. –
Джин C, если вы связываете двух обработчиков '.fail()', тогда два пожарных обработчика будут срабатывать, если между ними нет цепочки, чтобы обеспечить новое обещание с другим статусом. Это «что-то» должно быть правильно написано '.then()'. Как написано выше, промежуточный '.then()' без второго аргумента не будет иметь эффекта, когда 'firstDeferred' будет отклонен; статус «fail» будет распространяться прямо через '.then()', а второй обработчик '.fail()' будет срабатывать точно так же, как вы это заметили. –
@ Давид МакМуллин, что вы говорите, не на 100% правильно. Функция '.then()' jQuery позволяет получить новое обещание от любого из своих обработчиков, тем самым позволяя статус, переданный цепочкой, быть независимым от обещания, которое кормило '.then()' слева от него. Но '.then()' обработчики не всегда ведут себя таким образом. Возвращение не обещания будет распространять статус первоначального обещания, но разрешено/отклонено с возвращенным значением. Обработчики, не имеющие декларации возврата, принесут оригинальное обещание без изменений. Перемещение между различными задачами Promises_A действительно сложно. –