承诺 - 错误回调与捕获

kel*_*dar 15 angularjs q angular-promise

有人可以告诉我,如果使用错误回调与catch函数之间存在差异$q.promise吗?

例如两个代码片段在功能上是等价的吗?

function doSomething0() {
    var deferred = $q.defer();

    ...

    return deferred.promise;
 }

 doSomething0()
    .then(doSomething1)
    .then(doSomething2)
    .then(doSomething3)
    .catch(function (err) {
        // do something with `err`
    });
Run Code Online (Sandbox Code Playgroud)

function doSomething0() {
    var deferred = $q.defer();

    ...

    return deferred.promise;
 }

 function errorHandler(err) {
    // do something with `err`
 }

 doSomething0()
    .then(doSomething1, errorHandler)
    .then(doSomething2, errorHandler)
    .then(doSomething3, errorHandler);
Run Code Online (Sandbox Code Playgroud)

如果是这样,为什么要使用第二个呢?在我看来,它看起来更加丑陋并导致更多的代码重复?

Mar*_*elo 5

两者都会达到同样的效果,除了第二个可以运行errorHandler三次(而不是一次).你是正确的,它带来了一些代码重复,但它也允许你处理发生的任何错误,并继续你的链:

function errorHandler(err) {
  //log error, continue
  return $q.resolve('default value or something');
}

doSomething0()
  .then(doSomething1, errorHandler)
  .then(doSomething2, errorHandler)
  .then(doSomething3, errorHandler);
Run Code Online (Sandbox Code Playgroud)

  • 无需返回承诺.您只需返回一个值即可. (3认同)
  • @keldar你只需要从你的错误处理函数返回一个新的'Promise`,就像上面的例子一样! (2认同)