Я пытаюсь сравнить два подхода к использованию обещаний в угловом после чтения this article.Поведение обещания с угловым
Поэтому я использую этот код для сравнения с/без использования отложенных. Примечание: адрес http://localhost:1337/error возвращает ответ с состоянием http 500 и сообщение «ошибка» в качестве данных об ошибках (это предполагаемое поведение).
.controller("HomeCtrl", function($q, $http) {
function doAsyncCallDeferred() {
var deferred = $q.defer();
$http.get("http://localhost:1337/error")
.catch(function(errorData) {
// error
deferred.reject(errorData.data);
});
return deferred.promise;
}
function doAsyncCall() {
return $http.get("http://localhost:1337/error")
.catch(function(errorData) {
// error
return errorData.data;
});
}
doAsyncCallDeferred()
.then(function (data) {
console.log("with deferred success");
console.log(data);
})
.catch(function(errorData) {
// data should be "error"
console.log("with deferred error");
console.log(errorData);
});
doAsyncCall()
.then(function (data) {
console.log("without deferred success");
console.log(data);
})
.catch(function(errorData) {
// data should be "error"
console.log("without deferred error");
console.log(errorData);
});
})
Но я смущен результат:
with deferred error
error
without deferred success
error
Я предполагал, что с обоих подходов, подвох обратного вызова будет выполняться, но это, кажется, что это не так. Кто-нибудь может объяснить это поведение, пожалуйста?
Я думаю, это потому, что строки: 'deferred.reject (errorData.data);'. Он отвергает отложенные, поэтому вне функции все еще захватывает. Не могли бы вы проверить? – Joy
Избегайте [отложенного антипаттера] (http://stackoverflow.com/q/23803743/1048572) (в 'doAsyncCallDeferred')! Обратите внимание, что вы никогда не выполняете отложенное, когда вызов ajax преуспевает. – Bergi
@ Bergi, он * это * пытается избежать этого - первая ссылка на статью об отложенном антипаттере –