Javascript 返回Angularjs的两个承诺,如何链接以使UI具有$scope

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) {

我的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;
        });

这确实起到了作用,但我相信最好的做法是将这两个“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
并行调用这两个方法并合并承诺。请参阅:$q

getInfoInSet(setID)是如何获取setID的?这是因为
then
的链接。previous
then
的返回值是下一次回调中的参数。如果它解决了您的问题,也可以接受答案:)哦,是的,哈哈,如果我没有使用$q.all,目前我在哪里可以应用$scope。$apply()?您不需要显式调用
$scope。$apply
。它会立即触发消化循环。大多数情况下,你不需要像angular那样处理这个问题。但如果你确实想,你可以使用
。最后
链式方法