javascript - catch 之后执行

标签 javascript angularjs angular-promise

我有以下 fiddle : http://jsfiddle.net/thelgevold/3uv9nnjm/6/

angular.module('hello',[]).controller('helloController',function($q){

    console.clear();
    function someService(){
       var deferred = $q.defer();
       deferred.reject({e:'error'}); 
       return deferred.promise;
    } 

    function callService(){
        return someService().then(function(obj){
           console.log('first then');
        }).
        catch(function(e){
            console.log('error1');
            var deferred = $q.defer();
            deferred.reject({e:'error'}); 
            return deferred.promise;
        });
    }

    callService().catch(function(e){
      console.log('error2');
    }).then(function(e){
      console.log('second then');
    });

});

它本质上只是一个快速的 $q promise POC。我的问题是:为什么在拒绝 promise 时调用最后一个 then 子句?输出结果如下:

错误1

错误2

第二个

我理解为什么会打印 error1/error2,但我认为不应打印第二个 then 字符串,因为 promise 被拒绝了。我认为它会省略“second then”,原因与省略“first then”的原因相同。 有什么想法吗?

最佳答案

在我开始之前,不要这样做:

var deferred = $q.defer();
deferred.reject({e:'error'}); 
return deferred.promise;

这样做:

return $q.reject({e:'error'});

或者最好是这样:

return $q.reject(new Error('error'));

Beware the deferred antipattern.

现在,回答您的问题。


调用 callService() 之后的 .catch() 正在捕获错误并且不会产生新错误。它本质上已经“处理”了错误,可以自由调用以下 .then() 处理程序。

与您的示例等效的同步代码为:

function someService() {
  throw { e: 'error' };
}

function callService() {
  try {
    var obj = someService();
    console.log('first then');
  } catch (e) {
    console.log('error1');
    throw { e: 'error' };
  }
}

var e;
try {
  e = callService();
} catch (e) {
  console.log('error2');
}

console.log('second then');

我认为,如果您以这种方式看待它,它就非常有道理。

Promises/A+ 规范中的相关文本是 here .出于所有意图和目的,您可以将 catch 处理程序视为与 onRejected 处理程序相同的事物:

2.2.7. then must return a promise [3.3].

promise2 = promise1.then(onFulfilled, onRejected);

2.2.7.1. If either onFulfilled or onRejected returns a value x, run the Promise Resolution Procedure [[Resolve]](promise2, x).

基本上,您的 onRejected 处理程序正在“返回”值 undefined,因此 catch() 产生的 promise 解析为值 未定义

关于javascript - catch 之后执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28446869/

相关文章:

javascript - hashbang vs hijax

node.js - 在angularjs中通过history.replacestate更改url时如何停止页面刷新?

javascript - $q.allPromises 返回一个数组,但我只想要一个元素,而不是全部

angularjs - 如何使用 TypeScript 在 Controller 中处理 Angular Promise

javascript - 将过滤器选择作为对象发送以在 Angular 应用程序中返回多个值

javascript - 如何在javascript中更改表格单元格的颜色

javascript - 为什么我的 Angular 测试不像我的自定义表单验证功能?

javascript - 如何在angular js中返回或退出$scope函数

angularjs - 然后在里面调用 Angular Jasmine 测试函数

javascript - 在已解决的 promise 中解决新数据