angular 承诺行为
Promise behavior with angular
阅读 this article 后,我正在尝试比较在 angular 中使用承诺的两种方法。
所以我使用这段代码来比较 with/without 使用 deferred。注意:地址 http://localhost:1337/error returns 带有 http 500 状态的响应和消息 "error" 作为错误数据(这是预期的行为)。
.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
我假设这两种方法都会执行 catch 回调,但似乎并非如此。有人可以解释这种行为吗?
.then
和 .catch
是 try
/catch
的异步 "equivalent"。当你.catch
某物时,就意味着你"handled"它。
在 doAsyncCall
中,您正在处理 "exception"(这是一个承诺拒绝)并将 errorData.data
作为 data
返回给下一个 .then
。如果你想"re-throw",那么return $q.reject(errorData.data)
。
在 doAsyncCallDeferred
中,您明确拒绝了承诺。
举例来说,以下等同于他们的用户:
function doAsyncCallDeferred() {
var deferred = $q.defer();
$http.get("http://httpstat.us/500")
.then(function(response){
deferred.resolve(response.data);
})
.catch(function(errorData) {
deferred.reject(errorData.data);
});
return deferred.promise;
}
function doAsyncCall() {
return $http
.get("http://httpstat.us/500")
.then(function(response){
return response.data;
})
.catch(function(errorData){
return $q.reject(errorData.data);
});
}
阅读 this article 后,我正在尝试比较在 angular 中使用承诺的两种方法。
所以我使用这段代码来比较 with/without 使用 deferred。注意:地址 http://localhost:1337/error returns 带有 http 500 状态的响应和消息 "error" 作为错误数据(这是预期的行为)。
.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
我假设这两种方法都会执行 catch 回调,但似乎并非如此。有人可以解释这种行为吗?
.then
和 .catch
是 try
/catch
的异步 "equivalent"。当你.catch
某物时,就意味着你"handled"它。
在 doAsyncCall
中,您正在处理 "exception"(这是一个承诺拒绝)并将 errorData.data
作为 data
返回给下一个 .then
。如果你想"re-throw",那么return $q.reject(errorData.data)
。
在 doAsyncCallDeferred
中,您明确拒绝了承诺。
举例来说,以下等同于他们的用户:
function doAsyncCallDeferred() {
var deferred = $q.defer();
$http.get("http://httpstat.us/500")
.then(function(response){
deferred.resolve(response.data);
})
.catch(function(errorData) {
deferred.reject(errorData.data);
});
return deferred.promise;
}
function doAsyncCall() {
return $http
.get("http://httpstat.us/500")
.then(function(response){
return response.data;
})
.catch(function(errorData){
return $q.reject(errorData.data);
});
}