给出如下代码:
function webCall() {
return $http({ method: "POST",
url: "http://destined/to/fail", data: {param1: 1})
.success(function(data, status) { return { test: "success!";} } )
.error(function (data, status) {
return {errorMessage: "Totally failed!"};
});
我的理解是,如果我在返回的承诺上调用.then(),就像这样:
var myPromise = webCall().then(
function(response){
console.log(response.test);
},
function(reason) {
console.log(reason.errorMessage);
});
将相应的.success()和.error()回调的返回值传递给.then()回调。
然而,我没有看到我期望的行为。 使用GET可以正常工作。使用POST,不是那么多。我的假设是它应该像正常的延迟\承诺一样准确吗?它在哪里记录(除了来源)
答案 0 :(得分:0)
$http()
会返回一个承诺,但您返回的内容实际上是.error()
的结果,这不是承诺(至少没有记录)。
要返回承诺,您已使用then()
...
function webCall() {
return $http({ method: "POST",
url: "/destined/to/fail", data: {param1: 1})
.then(function(response) {
// if you need to access the data here, use response.data
return { test: "success!" };
}, function (response) {
throw { errorMessage: "Totally failed!" };
});
}
注意使用throw
来拒绝返回的promise,因为如果你只是从错误回调中返回,它实际上会解析产生的promise。
答案 1 :(得分:0)
它没有按预期工作的原因是因为.success
和.error
处理程序返回原始承诺,并且没有具有返回值成功/错误处理程序。您可以从source code for $http here。
promise.success = function(fn) {
promise.then(function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
您可以看到,一旦解决了承诺(当Web调用返回时),它将调用您的成功处理程序,然后对其执行任何操作。
当您将其与其他处理程序链接时,它是原始承诺的结果,并传递给其他处理程序。