AngularJS:同步多个独立的承诺

时间:2015-06-24 15:47:40

标签: javascript angularjs

我正在开发一个AngularJS应用程序,其中Factories(查询数据库)返回承诺。

对这些工厂的调用封装在以下功能中:

function getUsers(id) { 
    MyUserFactory.getUsers(id).then(function(data) { 
        $scope.mydata = data;
        ...lot of code...
    })
}

function updateAcordingToUserAndWeatherOfTheDay(day) {
    MyWeatherFactory.getWeather(day).then(function(data) {
        if ($scope.mydata.likesRain) {
             ...
        }
   })
}

然后我有一个:

getUser(42); updateAcordingToUserAndWeatherOfTheDay(monday);

显然,如果getUser()完成的异步查询没有时间完成,则会有两分之一的时间,updateAcordingToUserAndWeatherOfTheDay()上的$scope.mydata.likesRain会出现错误

我知道我可以链接.then()来强制一个查询等待另一个查询 这种重构需要花费很多时间,我现在还没有。

还有其他方法可以等待承诺完成吗?至少在重构之前临时修复bug。现在我们的解决方案是3秒计时器......

2 个答案:

答案 0 :(得分:2)

重构这很简单,只需要方法return即可。

function getUsers(id) { 
    return MyUserFactory.getUsers(id).then(function(data) { 
        $scope.mydata = data;
        ...lot of code...
    })
}

function updateAcordingToUserAndWeatherOfTheDay(day) {
    return MyWeatherFactory.getWeather(day).then(function(data) {
        if ($scope.mydata.likesRain) {
             ...
        }
   })
}

getUsers(42).then(function() { updateAcordingToUserAndWeatherOfTheDay(day); });

除了需要修改的代码之外,这不必更改任何现有代码(因为返回promise不会破坏任何现有的基础结构)。

这是重构的最快方法。

答案 1 :(得分:1)

.then()可能是正确的方法。使用回调的其他解决方案:

function getUsers(id, callback) { 
    MyUserFactory.getUsers(id).then(function(data) { 
        $scope.mydata = data;
        ...lot of code...
        if (typeof callback === "function") {
            callback();
        }
    })
}

getUser(42, function() {
    updateAcordingToUserAndWeatherOfTheDay(monday);
});