gpt4 book ai didi

angularjs - 如何在链式 promise 中间停止/中断

转载 作者:行者123 更新时间:2023-12-03 08:08:41 29 4
gpt4 key购买 nike

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

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

如果无法在链中停止流动,我是否必须在每个 then 中添加额外的条件的错误处理程序,还是有更优雅的方法?

angular.module("MyModule", []).controller("MyCtrl", ["$scope", "$q", "$timeout",
function($scope, $q, $timeout) {
$scope.result = "";
var d0 = $q.defer();
$timeout(function() {
d0.reject("A"); // the promise will fail
}, 1000);
d0.promise.then(
function(response) {
$scope.result += "|" + response + "|B";
var d1 = $q.defer();
$timeout(function() {
d1.resolve("C");
}, 1000);
return d1.promise;
},
function(response) {
$scope.result += "|" + response + "|D";
return $q.reject("E");
}
).finally( // it should stop here ...
function() { $scope.result += "|F"; }
).then(
function(response) {
$scope.result += "|" + response + "|G";
},
function(response) { // ... but instead it continues here
$scope.result += "|" + response + "|H";
return $q.reject("I");
}
).finally(
function() { $scope.result += "|J"; }
)
}
]);
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.22/angular.min.js"></script>
<div ng-app="MyModule" ng-controller="MyCtrl">
result: {{result}}
</div>

最佳答案

来自 $q.reject documentation :

当将 deferreds/promises 与熟悉的 try/catch/throw 行为进行比较时,将拒绝视为 JavaScript 中的 throw 关键字。这也意味着,如果您通过 Promise 错误回调“捕获”错误,并且想要将错误转发到从当前 Promise 派生的 Promise,则必须通过返回通过拒绝构造的拒绝来“重新抛出”错误。
reject不会自动中止 promise 链,它只会继续下一个 promise ,为剩余的每个 promise 调用错误处理程序。

另外,finally无论链是否出错,回调始终会运行。如果您不希望它运行,则由您手动检查 Promise 的状态。

编辑:

这是显示如何链接错误的答案的链接:

Break promise chain and call a function based on the step in the chain where it is broken (rejected)

关于angularjs - 如何在链式 promise 中间停止/中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25975082/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com