Javascript $q.拒绝和处理AngularJS链接承诺中的错误

Javascript $q.拒绝和处理AngularJS链接承诺中的错误,javascript,angularjs,promise,chaining,Javascript,Angularjs,Promise,Chaining,我很难理解链接承诺错误处理的基本概念。 为了学习规则,我写了一个简单的例子,猜测结果会是什么。但不幸的是,它的行为不像我想象的那样。 我已经读过多篇关于这个主题的文章,但可能因为我的英语不好而无法获得详细信息 无论如何,这是我的代码: var promiseStart = $q.when("start"); var promise1 = promiseStart.then(function() { return Serviceforpromise1.get

我很难理解链接承诺错误处理的基本概念。 为了学习规则,我写了一个简单的例子,猜测结果会是什么。但不幸的是,它的行为不像我想象的那样。 我已经读过多篇关于这个主题的文章,但可能因为我的英语不好而无法获得详细信息

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

    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一样,我返回了一个被拒绝的承诺!)

我将很高兴深入了解这里正在发生的事情。
感谢您的帮助。

您的理解是正确的,问题似乎存在于您试图观察这种行为的方式中(您没有向我们展示的东西)

如果在
then()
中从成功或错误处理程序返回被拒绝的承诺,则
then()
返回的承诺将解析为被拒绝的承诺。请注意:

angular.module('app',[])
.控制员('C'[
“$q”,
功能($q){
var promiseStart=$q.when(“开始”);
var promise1=promiseStart.then(函数(值){
log('得到一个值:',值);
返回$q.reject('错误!');
});
var promise2=promise1.then(函数(数据1){
返回“得到一些东西”;
},函数(错误){
log(“捕获到错误:”,错误);
返回$q.reject('新错误');
});
var promiseend=promise2.then(函数(数据2){
返回数据2;
},函数(错误){

console.log('捕获到错误:',错误);//你是如何检查promise2的错误回调没有被调用的?我没有看到任何东西可以告诉你它是否被调用。是的,我登录到控制台,但删除了日志代码,以便帖子不必为不相关的行而烦恼。我一方面感到放心,另一方面感到焦虑。你的例子是有效的ng非常好。我将尝试剪切和粘贴您的代码,并用我的代码替换每一行,以发现我的错误。我会带着评论回来。谢谢SupDate:好的,您是对的。这是我在stackoverflow上编写示例时修复的一个错误,在我的原始代码中留下了错误。谢谢您将其指向我,并感谢您的确认我的gess。@JLRishe您返回成功的错误数据有什么原因吗?据我所知,被拒绝的承诺不会停止JavaScript的执行。我只是想知道,因为我仍然掌握着承诺的诀窍,而您似乎可以用任何一种方式来做。@Usagi我在那里返回一个错误,因为OP在他们的代码中就是这么做的。我所做的一切在这一部分中添加了一个
console.log
,以显示发生了什么。我同意,通常不会从错误处理程序返回错误;它们会重新返回、抛出新错误、返回一些值或不返回任何内容。