我正在开发一个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
会出现错误{ p>
我知道我可以链接.then()
来强制一个查询等待另一个查询
这种重构需要花费很多时间,我现在还没有。
还有其他方法可以等待承诺完成吗?至少在重构之前临时修复bug。现在我们的解决方案是3秒计时器......
答案 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);
});