Javascript AngularJS:同步多个独立的承诺
我正在开发一个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
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=最糟糕的解决方案,此时您可以通过在需要的地方返回承诺来替换该计时器。