Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何在链式承诺的中间停止/突破_Angularjs_Angular Promise - Fatal编程技术网

Angularjs 如何在链式承诺的中间停止/突破

Angularjs 如何在链式承诺的中间停止/突破,angularjs,angular-promise,Angularjs,Angular Promise,我有一系列对服务器的$http调用。如果一个调用失败,我想向用户显示通知并停止链。起初我以为可以使用$q.reject来停止该链,但结果是程序流继续到下一个然后的错误处理程序。我也尝试过不返回任何内容,但流程仍在继续 我可以在链条中间停止流动吗?例如,下面的脚本应该打印result:| A | D | F,而不是result:| A | D | F | E | H | J 如果流不能在链中间停止,我必须在每个然后的错误处理程序中添加额外的条件,还是有更优雅的方法 angular.module(

我有一系列对服务器的$http调用。如果一个调用失败,我想向用户显示通知并停止链。起初我以为可以使用$q.reject来停止该链,但结果是程序流继续到下一个
然后
的错误处理程序。我也尝试过不返回任何内容,但流程仍在继续

我可以在链条中间停止流动吗?例如,下面的脚本应该打印
result:| A | D | F
,而不是
result:| A | D | F | E | H | J

如果流不能在链中间停止,我必须在每个
然后
的错误处理程序中添加额外的条件,还是有更优雅的方法

angular.module(“MyModule”、[]).controller(“MyCtrl”、[“$scope”、“$q”、“$timeout”,
函数($scope,$q,$timeout){
$scope.result=“”;
var d0=$q.defer();
$timeout(函数(){
拒绝(A);//承诺将失败
}, 1000);
那么,答应我吧(
功能(响应){
$scope.result+=“|”+响应+“|B”;
变量d1=$q.defer();
$timeout(函数(){
d1.决议(“C”);
}, 1000);
回报d1.承诺;
},
功能(响应){
$scope.result+=“|”+响应+“| D”;
返回$q.reject(“E”);
}
).最后(//应该到此为止。。。
函数(){$scope.result+=“|F”;}
).那么(
功能(响应){
$scope.result+=“|”+响应+“| G”;
},
函数(response){//…但它在这里继续
$scope.result+=“|”+响应+“| H”;
返回$q.reject(“I”);
}
).最后(
函数(){$scope.result+=“|J”;}
)
}
]);

结果:{{result}}

来自
$q.reject

当比较尊重/承诺与熟悉的try/catch/throw行为时,可以将reject作为JavaScript中的throw关键字。这也意味着,如果您通过承诺错误回调“捕获”错误,并且希望将错误转发到从当前承诺派生的承诺,那么您必须通过返回通过拒绝构造的拒绝来“重试”错误

reject
不会自动中止承诺链,它只会继续执行下一个承诺,为每个剩余的承诺调用错误处理程序

此外,无论链是否出错,
finally
回调始终将运行。如果您不想让它运行,那么就由您手动检查承诺的状态

编辑:

下面是一个链接,指向显示如何链接错误的答案:


这是我在阅读了@bmceldowney提供的文章后得出的结论:

流将始终转到下一个
然后
,因此为了停止,不要在需要停止的路径/承诺上提供下一个
然后
,而只将下一个
然后
放在需要继续的路径/承诺上

在我的情况下,我不希望链在收到第一个承诺的错误后继续,因此下一个
then
应该附加在第二个承诺上,而不是第一个
then

d0.promise.then(
    function(response) {
        // ...
        return d1.promise.then(     // append the next then here ...
            // ...
        ).catch (
            // ...
        ).finally(
            // ...
        );
    }
).catch (
    // ...
).finally(
    // ...
);                                  // ... instead of here
angular.module(“MyModule”、[]).controller(“MyCtrl”、[“$scope”、“$q”、“$timeout”,
函数($scope,$q,$timeout){
$scope.result=[];
var d0=$q.defer();
$timeout(函数(){d0.reject();},1000);
那么,答应我吧(
功能(响应){
$scope.result.push(“d0成功”);
变量d1=$q.defer();
$timeout(函数(){d1.reject();},1000);
返回d1。承诺。然后(
函数(响应){$scope.result.push(“d1成功”);}
).接住(
函数(响应){$scope.result.push(“d1失败”);}
).最后(
函数(){$scope.result.push(“finally2”);}
);
}
).接住(
函数(响应){$scope.result.push(“d0失败”);}
).最后(
函数(){$scope.result.push(“finally1”);}
);
}
]);

结果:

{{msg}}