【问题标题】:$q.reject and handling errors in AngularJS chained promises$q.reject 和处理 AngularJS 链式承诺中的错误
【发布时间】:2015-05-24 09:20:28
【问题描述】:

我无法理解使用链式 Promise 处理错误的基本概念。 为了学习规则,我写了一个简单的例子,猜猜结果会是什么。但不幸的是,它并没有像我那样表现。 我已阅读有关该主题的多篇文章,但由于我的英语语言不佳,我可能无法获得详细信息。

无论如何,这是我的代码:

    var promiseStart = $q.when("start");
    var promise1 = promiseStart.then(function() {
            return Serviceforpromise1.get();
    });
    var promise2 = promise1.then(function(data1)
    {
            return Serviceforpromise2.get(data1);
    },function(error)
    {
            return $q.reject();
    });
    var promiseend = promise2.then(function(data2)
    {
            return data2;
    },function(error)
    {
            return error;
    });
    return promiseend;

好吧,我知道它可以更好地编码,但这只是为了达到目的。 这是Serviceforpromise1函数的代码:

    function Serviceforpromise1()
    {
            ...
            return $http.get(*whatever*).then(function (data){
                return data;
            },function(error)
            {
                return $q.reject();
            });
    }

仅考虑 Serviceforpromise1 失败的情况。 $q.reject 被发送回主链,所以我正在等待“promise1 .then(”的错误回调被调用并且它按预期工作。我决定为示例将错误转移到“promise2 .then”,所以在这个错误回调中我添加了 return $q.reject(); 但它从未到达第二个错误回调(“promise2 .then”),我不明白为什么(就像 Serviceforpromise1,我返回了一个被拒绝的承诺!)

我很乐意深入了解这里发生的事情。 感谢您的帮助。

【问题讨论】:

  • 你如何检查promise2的错误回调没有被调用?我没有看到任何可以告诉你它是否被调用的东西。
  • 是的,我登录到控制台,但删除了帖子的日志记录代码,以免打扰不相关的行

标签: javascript angularjs promise chaining


【解决方案1】:

您的理解是正确的,问题似乎出在您尝试观察此行为的方式上(在您没有向我们展示的地方)。

如果您从then() 中的成功或错误处理程序返回一个被拒绝的promise,那么then() 返回的promise 将解析为一个被拒绝的promise。观察:

angular.module('app', [])
    .controller('C', [
    '$q',

function ($q) {
    var promiseStart = $q.when("start");
    var promise1 = promiseStart.then(function (value) {
        console.log('Got a value:', value);
        return $q.reject('Error!');
    });

    var promise2 = promise1.then(function (data1) {
        return "Got some stuff";
    }, function (error) {
        console.log("Caught an error:", error);
        return $q.reject('New error');
    });

    var promiseend = promise2.then(function (data2) {
        return data2;
    }, function (error) {
        console.log('Caught an error:', error);  // <-- this is logged to the console
        return error;
    });

    return promiseend;
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.10/angular.min.js"></script>
<div ng-app='app' ng-controller='C'></div>

这里要注意的一点是,在最后一个处理程序中,您返回 error 变量,而不是抛出异常或返回被拒绝的承诺。所以在这种情况下,promiseend成功解析为 error 变量的值。

【讨论】:

  • 感谢您的回答。我一方面放心,另一方面也很焦虑。你的例子工作得很好。我将尝试剪切和粘贴您的代码并用我的替换每一行以找出我的错误。我会带着cmets回来。谢谢
  • 更新:好的,你是对的 JLRishe。这是我在 stackoverflow 上编写示例时修正的一个错字,将错误留在了我的原始代码中。谢谢你指点我,谢谢你确认我的猜测。
  • @JLRishe 您是否有理由将错误数据返回为成功?据我了解,被拒绝的承诺不会停止 JavaScript 的执行。我只是想知道,因为我仍然有一些承诺,而且看起来你可以做到这一点。
  • @Usagi 我在那里返回一个错误,因为这就是 OP 在他们的代码中所做的。我对那部分所做的只是添加一个console.log 来显示发生了什么。我同意通常不会从错误处理程序返回错误;他们要么重新抛出,抛出一个新的错误,返回一些值,或者什么都不返回。
猜你喜欢
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 2014-06-15
  • 2014-08-12
  • 2014-08-12
相关资源
最近更新 更多