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