如何将多个onError函数分配给promise(由angular's$http.post返回)
How to assign multiple onError functions to a promise (returned by angular's $http.post)
My AngularJS代码需要将多个onSuccess
、onError
函数链接到$http.post
返回的promise
var promise = $http.post(url);
promise
.then(
/*success 1*/function () { console.log("success 1"); },
/*error 1*/function () { console.log("error 1"); })
.then(
/*success 2*/function () { console.log("success 2"); },
/*error 2*/function () { console.log("error 2"); });
上面代码的问题是,当HTTP响应失败时,它会打印error 1
>success 2
,而不是error 1
>error 2
。
我对stackoverflow做了一些研究,发现当你可以访问$q
时,你可以在error 1
中执行$q.reject()
来触发error 2
,但在我的情况下,我只能访问$http.post
返回的promise。那我该怎么办?
p。S.当然,我可以从error 1
内部调用error2()
,但我想将它们链接起来,因为它看起来更可读、更可扩展。
有什么想法吗?
从成功/错误处理程序返回值(或不返回值)将解决链中下一个then块的承诺。要传播拒绝,请返回$q.request():
var promise = $http.post(url);
promise
.then(
/*success 1*/function () { console.log("success 1"); },
/*error 1*/function () { console.log("error 1"); return $q.reject();})
.then(
/*success 2*/function () { console.log("success 2"); },
/*error 2*/function () { console.log("error 2"); });
您的问题源于对promise所能实现的功能的误解,即异步代码组合与try
/catch
同步代码的组合相似,并具有适当的异常处理。
我特别指的是你的声明:
"但我想把它们链接起来,因为它看起来更可读、更可扩展。"
作为链接误解的根源。
如果您的示例是同步的(假设所有异步调用都被阻塞),这很可能是您想要做的:
try {
var data = $http.post(url); // blocking
var res1 = doSuccess1(data);
var ret = doSuccess2(res1);
}
catch(e){
errorHandler1(e);
errorHandler2(e);
}
而不是这个:
try {
try {
var data = $http.post(url);
var res1 = doSuccess1(data);
} catch (e) {
errorHandler1(e);
// throw ""; // this is what returning $q.reject would have done - a rethrow
}
} catch (e) {
errorHandler2(e);
}
var ret = doSuccess2(res1);
这就是你通过链接所能达到的。换句话说,嵌套的try
/catch
和doSuccess2
中未处理的异常。
以下是第一种方法的异步并行:
var ret;
$http.post(url)
.then(function(data){
var res1 = doSuccess1(data);
ret = doSuccess2(res1);
}
.catch(function(e){ // or .then(null, handler)
doError1(e);
doError2(e);
})
如果其中一个doSuccessN
函数也是异步的:
var ret;
$http.post(url)
.then(doSuccess1Async)
.then(function(res1){
ret = doSuccess2(res1);
}
.catch(function(e){ // or .then(null, handler)
doError1(e);
doError2(e);
})
只需将处理程序包装在一个函数中,在成功/错误处理程序参数中:
var promise = $http.post(url);
promise
.then(function(argX, argY){
success1(argX, argY);
success2(argX, argY);
},
function(argX, argY){
error1(argX, argY);
error2(argX, argY);
});
相关文章:
- Angular js-返回一个包含类似
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- 将复杂对象从angular js传递到web api,它总是返回404
- Angular,函数在(模型)工厂中返回值
- Angular js http get返回所有页面
- angular.注射器阵列值未返回当前值
- Angular limitTo未返回正确的输出
- chrome.storage.sync.get未返回值-Angular服务
- Angular Cross Origin Request CORS失败,但节点http.get()成功返回
- 如何将多个onError函数分配给promise(由angular's$http.post返回)
- angular payments返回带有测试数据的无效卡
- 我怎么能在Angular JS中等待,直到我的web服务返回
- 使用 Angular 返回已在 ASP.NET API 中的其他表数据
- Angular$q返回promise两次$http服务调用
- Passport local使用Angular返回错误400错误请求
- 为什么angular返回回调函数内部的函数
- Angular返回一个空页面,即使所有数据都在那里
- Angular-返回$modal promise并拒绝它
- Angular返回$$state对象-Angular和Kinvey
- Angular返回用[]封装的数组值