Javascript 返回Angularjs的两个承诺,如何链接以使UI具有$scope
我的UI被破坏了,因为我的第二个承诺在第一个承诺中有一个依赖项,不能很快解决。因此,我接受了第二个承诺,并将其嵌套在第一个承诺中,如下所示:Javascript 返回Angularjs的两个承诺,如何链接以使UI具有$scope,javascript,angularjs,promise,angular-promise,http-get,Javascript,Angularjs,Promise,Angular Promise,Http Get,我的UI被破坏了,因为我的第二个承诺在第一个承诺中有一个依赖项,不能很快解决。因此,我接受了第二个承诺,并将其嵌套在第一个承诺中,如下所示: csRepo.getSet(setID).then( function (val) { $scope.dataSet= val; csRepo.getInfoInSet(setID).then( function (val) {
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;
});
这确实起到了作用,但我相信最好的做法是将这两个“then”链接在一起。这是真的吗?如果是的话,有人能重构我的代码样本来展示这一点吗?谢谢 在您的示例中,您可以单独调用这两个方法,因为函数调用结束时可以使用
setID
,但是如果您只想在csRepo.getInfoInSet
之后调用csRepo.getSet
,您可以这样做:
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
并行调用这两个方法并合并承诺。请参阅:$qgetInfoInSet(setID)是如何获取setID的?这是因为then
的链接。previousthen
的返回值是下一次回调中的参数。如果它解决了您的问题,也可以接受答案:)哦,是的,哈哈,如果我没有使用$q.all,目前我在哪里可以应用$scope。$apply()?您不需要显式调用$scope。$apply
。它会立即触发消化循环。大多数情况下,你不需要像angular那样处理这个问题。但如果你确实想,你可以使用。最后链式方法