如何在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
方法并将errorHandler1
和errorHandler2
作为第二个参数传递。
【讨论】:
这将在 Angular 中将错误记录到$exceptionHandler
,而且我认为这不是 OP 想要的。
对,我不知道有return $q.reject();
这样的选项。这比抛出错误要好得多。这也是Q
库的标准,而不仅仅是角度的$q
?
在 Q 中,throw
完全没问题,因为 $exceptionHandler hack 不存在 - 尽管你真的不应该再在新代码中使用 Q。
虽然你真的不应该在新代码中使用 Q - 你的意思是在角度代码中吗?
是的,以这种方式返回被拒绝的 Promise 是 Promises/A+ 标准的要求。它将在所有 Promises/A+ 实现中表现一致。以上是关于如何在angularjs中链接promise错误函数的主要内容,如果未能解决你的问题,请参考以下文章
如何对 AngularJS $promise.then 进行单元测试