从promise finally块中没有抛出角度错误

时间:2015-06-15 07:02:27

标签: javascript angularjs error-handling deferred angular-promise

出于某种原因,当它们出现在promise的“finally”块中时,我没有看到任何错误(如语法错误)。那是为什么?

angular.module('App', [])
  .controller('AppCtrl', function(TestService) {

    TestService.outerMethod().then(function() {
      console.log('Success')
    }, function(error) {
      console.error('Error')
    })

  })

.service('TestService', function($q) {

  this.outerMethod = outerMethod;

  function innerMethod() {
    var deferred = $q.defer();
    deferred.resolve();
    return deferred.promise;
  }

  function outerMethod() {

    var deferred = $q.defer();

    // syntaxErrorVisible

    innerMethod().finally(function() {

      // syntaxErrorNotVisible
      deferred.resolve();

    });

    return deferred.promise;
  }

})

;

Codepen:http://codepen.io/anon/pen/vOJGpG

问题在于,当我们取消注释这些注释时会发生语法错误,当错误被置于此代码的“finally”块内时,我们不会发生任何错误(在浏览器控制台中)。

Expecting syntax error but not shown Showing error as expected

2 个答案:

答案 0 :(得分:0)

问题在于你回复承诺的方式:

return deferred.promise

在这一行上,您刚刚返回原始承诺。您的来电者对附加到它的finally一无所知。为了保持链,您需要返回finally返回的承诺:

function outerMethod() {

    var deferred = $q.defer();

    // syntaxErrorVisible

    return innerMethod().finally(function() {

      syntaxErrorNotVisible
      deferred.resolve();

    });
}

Updated Pen

答案 1 :(得分:0)

我尝试编辑它看起来更适合你尝试做什么。 它没有测试但应该工作。

.service('TestService', function($q) {


  this.innerMethod = function() {
    var deferred = $q.defer();
    deferred.resolve();
    return deferred.promise;   }



this.outerMethod = function(){  var deferred1 = $q.defer();

    this.innerMethod().then(
        function(success){
            deferred1.resolve("resolved");
    },
    function(error){

    })

} })
  • 这是q库,可以帮助您了解q promise如何工作