如何在AngularJS中链接承诺错误函数

13

我知道如何链接 Promise,以便执行多个成功函数。这在许多示例中已经解释过了。那么,如何链接 Promise,以便执行多个错误函数?


2
对我来说这不是重复的。感谢回答我的问题。 - Galdor
2个回答

33

当错误被处理后(且要么返回一个值,要么不返回任何值),从 then 返回的 Promise 被视为已解决。您必须从每个错误处理程序中返回一个 rejected Promise,以便传播和链接错误处理程序。

例如:

promseA.then(
   function success() {
   },
   function error() {
      return $q.reject();
   })
.promiseB.then(
   function success() {
   },
   function error() {
      return $q.reject();
   })
.promiseC.then(
   function success() {
   },
   function error() {
      return $q.reject();
   });

3
如果一个被拒绝的promise有一个拒绝处理程序,那么该promise仍然保持被拒绝状态,因为一旦promise被解决,它就不会再转换。从可thenable链接的返回promise将被解决,如果从promise错误处理程序返回的值不是一个被拒绝的promise。 - Benjamin Gruenbaum
我认为我们的意思是一样的。当我说“承诺被视为已解决”时,实际上是指从then调用返回的承诺。然而,我的措辞可能不够清晰... - pixelbits
感谢您澄清,我找到了一个重复但仍然很好的答案。 - Benjamin Gruenbaum
1
@pixelbits,“return $q.reject()”确实比“throwing”更好,但也许您可以将此选项添加到您的答案中,以便如果OP看到这种技术,他会认识到它。 - Max Koretskyi

0

then/fail 函数返回一个 Promise,如果抛出错误,它可以被拒绝。如果您想链接多个错误处理程序并同时触发它们,您应该从前面的错误处理程序中抛出错误。

var d = $q.defer();
d.promise.catch(errorHandler1).catch(errorHandler2);
d.reject();

function errorHandler1 {
 throw new Error();
}

function errorHandler2() {
  console.log("I am triggered");
}

或者你可以使用then方法,将errorHandler1errorHandler2作为第二个参数传递,而不是使用catch


3
这将在Angular中将错误记录到$exceptionHandler,而且我认为这不是OP想要的。 - Benjamin Gruenbaum
3
在 Q 中,使用 throw 是完全可以的,因为 $exceptionHandler hack 不存在 - 尽管你不应该在新代码中继续使用 Q。 - Benjamin Gruenbaum
我明白了,谢谢。Q使用Promises/A+标准以及本地实现,所以我猜总体方法也是相同的,对吗?返回一个被拒绝的Promise也是Promises/A+标准吗? - Max Koretskyi
3
是的,按照 Promises/A+ 标准的要求,返回一个被拒绝的 Promise 会以这种方式表现。它将在所有 Promises/A+ 实现中表现一致。 - Benjamin Gruenbaum
谢谢,你知道在非Angular应用程序中何时使用抛出或返回拒绝的承诺吗? - Max Koretskyi
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接