Если вы хотите зафиксировать невыполнение обещания и преобразовать его в успех, вы можете использовать failFilter со значением , а затем , чтобы вернуть разрешенное обещание, например, так:
deferredCall.then(function(answer) {
// this is success. you might transform the answer here.
return transformed;
}, function() {
// this is a fail. you might resolve the fail with an empty object.
return $.Deferred().resolve({}).promise();
});
Это обеспечит возможность продолжения цепи после неисправности.
Итак, для вашего примера, вы можете сделать это:
$.when([
a.ajax(),
b.ajax().then(function(answer) {
return answer;
}, function() {
return $.Deferred().resolve({}).promise();
}),
c.ajax()
]).then(function(results) {
// etc.
});
Пример 2. В моих приложениях я иногда использую , а затем , чтобы получить реляционные данные для конкретной сущности и учесть возможность 404 указать, что таких отношений не существует:
getEntity(id).then(function(entity) {
return getAssociation(id).then(function(association) {
entity.association = association;
return entity;
}, function() {
entity.association = null;
return $.Deferred().resolve(entity).promise();
});
}).done(function(entity) {
// etc.
});
Обратите внимание, в старых ответах предлагается использовать метод pipe . Начиная с версии jQuery 1.8 этот метод устарел.