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

如何在angularjs中链接承诺错误函数,angularjs,promise,deferred,Angularjs,Promise,Deferred,我知道如何连锁承诺,以便执行多个成功功能。许多例子都说明了这一点。如何链接承诺以执行多个错误函数?然后/失败函数返回一个承诺,可以通过抛出错误来拒绝该承诺。如果您想链接多个错误处理程序并触发它们,您应该从前面的错误处理程序中抛出错误 var d = $q.defer(); d.promise.catch(errorHandler1).catch(errorHandler2); d.reject(); function errorHandler1 { throw new Error(); }

我知道如何连锁承诺,以便执行多个成功功能。许多例子都说明了这一点。如何链接承诺以执行多个错误函数?

然后
/
失败
函数返回一个承诺,可以通过抛出错误来拒绝该承诺。如果您想链接多个错误处理程序并触发它们,您应该从前面的错误处理程序中抛出错误

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
方法而不是
catch
,并将
errorHandler1
errorHandler2
作为第二个参数传递。

当处理错误时(或者返回值,或者根本没有值),从那时返回的承诺被视为已解决。为了传播和链接错误处理程序,您必须从每个错误处理程序返回一个被拒绝的承诺

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

function errorHandler1 {
 throw new Error();
}

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

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

这将在Angular中记录一个错误到
$exceptionHandler
,我也不认为这是OP想要的。这比抛出一个错误要好得多。这也是
Q
库的标准,不仅仅是angular的
$Q
?在Q中,抛出
是非常好的,因为$exceptionHandler黑客不存在-尽管你真的不应该在新代码中使用Q了。虽然你真的不应该在新代码中使用Q了-你是说在angular代码中吗?是的,以这种方式返回被拒绝的承诺是承诺/a+标准的要求。它将在所有承诺/A+实现中保持一致。当一个被拒绝的承诺有一个拒绝处理程序时,该承诺仍然被拒绝,因为承诺一旦解决就永远不会转换。如果从promise错误处理程序返回的值不是拒绝的promise,那么从表链接返回的promise将被解析。我想我们说的是同一件事。当我说“该承诺已被视为已解决”时,我实际上指的是从当时的电话中返回的承诺。但是,我的措辞可能会更清楚……感谢您的澄清,现在找到了一个重复但很好的答案。@pixelbits,
return$q.reject()
确实是一个比抛出
更好的选项,但也许您也可以将此选项添加到您的答案中,以便OP if看到此技术时能够识别它。对我来说,它不是重复的。感谢您回答我的问题。