我的UI崩溃了,因为我的第二个承诺在第一个承诺中有一个依赖项,解决得不够快。因此,我接受了第二个承诺,并将其嵌套在第一个承诺中,如下所示:
csRepo.getSet(setID).then(
function (val) {
$scope.dataSet= val;
csRepo.getInfoInSet(setID).then(
function (val) {
$scope.dataSet.InfoOfSet = val;
$scope.$apply();
})
.catch(function (reason) {
throw "getInfoSet:" + reason;
});
$scope.$apply();
})
.catch(function (reason) {
throw "getSet() :" + reason;
});
这确实起到了作用,但我相信最好的做法是将两者"然后"联系在一起。这是真的吗?如果是的话,有人能重构我的代码样本来展示这一点吗?谢谢
在您的示例中,您可以独立调用这两个方法,因为setID
可以从函数调用的闭包中获得,但如果您只想在csRepo.getSet
之后调用csRepo.getInfoInSet
,您可以这样做:
csRepo.getSet(setID).then(
function (val) {
$scope.dataSet= val;
return setID;
})
.then(csRepo.getInfoInSet)
.then(function (val) {
$scope.dataSet.InfoOfSet = val;
})
.catch(function (reason) {
throw reason;
})
您不需要每次都调用$scope.$apply
,因为它也会影响性能。您可以使用$q.all
并行调用这两个方法并组合promise。请参阅:https://docs.angularjs.org/api/ng/service/$q