Javascript AngularJS:同步多个独立的承诺

Javascript AngularJS:同步多个独立的承诺,javascript,angularjs,Javascript,Angularjs,我正在开发一个AngularJS应用程序,其中工厂(查询数据库)返回承诺 对这些工厂的调用封装在以下函数中: function getUsers(id) { MyUserFactory.getUsers(id).then(function(data) { $scope.mydata = data; ...lot of code... }) } function updateAcordingToUserAndWeatherOfTheDay(da

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

对这些工厂的调用封装在以下函数中:

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()
完成的异步查询没有时间完成,我在
$scope.mydata.likesRain

我知道我可以链接
.then()
,强制一个查询等待另一个查询,但是 这种重构将花费我现在没有的很多时间

有没有其他方法可以让我等待承诺完成?至少在重构之前暂时修复缺陷。现在我们的解决方案是3秒计时器…

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

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

重构这很简单,只要有方法
return
promise即可

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); });
除了需要修改的代码外,这不需要更改任何现有代码(因为返回承诺不会破坏任何现有的基础结构)


这是进行重构的最快方法。

这正是我要寻找的!!!谢谢你,我尝试过了,冷却结束后立即接受你的答案:)如果getUsers()中有错误,我如何才能正确地打破承诺链?完成小提琴并找到了这个答案><@IggY:如果你的getUsers拒绝承诺,那么第二个函数将不会被调用,因为它位于解析路径中。您可以通过在中添加第二个函数来处理错误(打印错误消息)。然后()
是否正确
取决于在
getUsers
中出现错误时要执行的操作
。然后
接受(至少)两个参数,第一个函数在承诺的
成功
时调用,第二个函数在
错误
时调用(当前一个承诺返回被拒绝或被拒绝的承诺时)。只需将第二个回调方法添加到
。然后在任何需要检查错误的地方执行
函数。3second timer=最糟糕的解决方案,此时您可以通过在需要的地方返回承诺来替换该计时器。