如何将多个onError函数分配给promise(由angular's$http.post返回)

How to assign multiple onError functions to a promise (returned by angular's $http.post)

本文关键字:angular 返回 post http onError 函数 promise 分配      更新时间:2023-09-26

My AngularJS代码需要将多个onSuccessonError函数链接到$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/catchdoSuccess2中未处理的异常。

以下是第一种方法的异步并行:

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);
  });