如何在angularjs中链接promise错误函数

Posted

技术标签:

【中文标题】如何在angularjs中链接promise错误函数【英文标题】:How to chain promise error functions in angularjs 【发布时间】:2015-06-18 09:59:58 【问题描述】:

我知道如何链接承诺,以便执行多个成功函数。这在许多例子中得到了说明。如何链接 promise 以执行多个错误函数?

【问题讨论】:

对我来说这不是重复的。感谢您回答我的问题。 【参考方案1】:

当错误被处理(并且,要么返回一个值,要么根本没有值),从那时返回的承诺被认为已解决。您必须从每个错误处理程序返回一个被拒绝的承诺,以便传播和链接错误处理程序。

例如:

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

【讨论】:

当一个被拒绝的 Promise 有一个拒绝处理程序时,该 Promise 仍然被拒绝,因为 Promise 一旦解决就永远不会转换。 如果从 promise 错误处理程序返回的值不是被拒绝的 promise,则从 thenable 链接返回的 promise 被解析 我想我们说的是同一件事。当我说“承诺被认为已解决时,我实际上指的是从 then 调用返回的承诺。但是,我的措辞可能更清楚...... 感谢您的澄清,但现在找到了一个重复但很好的答案。 @pixelbits, return $q.reject() 确实是比 throwing 更好的选择,但也许您也可以将此选项添加到您的答案中,以便 OP 如果看到这种技术就会识别它。【参考方案2】:

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

或者代替catch,您可以使用then 方法并将errorHandler1errorHandler2 作为第二个参数传递。

【讨论】:

这将在 Angular 中将错误记录到 $exceptionHandler,而且我认为这不是 OP 想要的。 对,我不知道有return $q.reject();这样的选项。这比抛出错误要好得多。这也是Q 库的标准,而不仅仅是角度的$q 在 Q 中,throw 完全没问题,因为 $exceptionHandler hack 不存在 - 尽管你真的不应该再在新代码中使用 Q。 虽然你真的不应该在新代码中使用 Q - 你的意思是在角度代码中吗? 是的,以这种方式返回被拒绝的 Promise 是 Promises/A+ 标准的要求。它将在所有 Promises/A+ 实现中表现一致。

以上是关于如何在angularjs中链接promise错误函数的主要内容,如果未能解决你的问题,请参考以下文章

如何对 AngularJS $promise.then 进行单元测试

AngularJS Promise 错误捕获

解决中的 AngularJS 注入错误

如何使用 Promise 将参数传递给 AngularJS 中的函数

在维护数据的同时链接 Promise(角度 js)

[AngularJS] AngularJS系列 进阶篇之promise