【问题标题】:Angular error not thrown from promise finally block最终阻止不会从承诺中抛出角度错误
【发布时间】:2015-08-30 14:10:54
【问题描述】:

由于某种原因,当它们出现在 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

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

【问题讨论】:

  • 我刚刚注意到了同样的事情。它只是默默地失败了。
  • 读了一会儿,意识到这是因为 .finally() 本身返回了一个承诺。如果您在其后添加 .catch() ,您可以看到错误。看看这个:github.com/kriskowal/q/wiki/…

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


【解决方案1】:

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

return deferred.promise

在这一行中,您刚刚返回了原始承诺。您的呼叫者对附加的finally 一无所知。为了保链,需要返回finally返回的promise:

function outerMethod() {

    var deferred = $q.defer();

    // syntaxErrorVisible

    return innerMethod().finally(function() {

      syntaxErrorNotVisible
      deferred.resolve();

    });
}

Updated Pen

【讨论】:

    【解决方案2】:

    我尝试对其进行编辑,使其看起来比您尝试做的更好。 它未经测试,但应该可以工作。

    .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 的工作原理

    【讨论】:

      猜你喜欢
      • 2019-04-07
      • 1970-01-01
      • 2020-04-01
      • 2020-07-22
      • 2016-02-26
      • 1970-01-01
      • 2018-10-29
      • 2020-08-29
      • 2018-02-19
      相关资源
      最近更新 更多