我正在使用angularjs 1.6.1和$ q。我正在从API和API加载一堆数据。当承诺得到履行时,我有点麻烦。我正在做这样的事情:
// controller
this.dataOnePromise = dataOneService.get().then(function (response){
$scope.dataOne = response.data;
return $scope.dataOne;
});
this.dataTwoPromise = dataTwoService.get().then(function (response){
$scope.dataTwo = response.data;
return $scope.dataTwo;
});
let promises = [this.dataOnePromise, this.dataTwoPromise];
$q.all(promises).then(function(response){
// data is loaded!
// I will access $scope.dataOne and $scope.dataTwo
});
所有服务方法都是这样的:
// service. Just the method, not the complete file
get: function() {
var defered = $q.defer();
$http.get('my api endpoint').then(function(response) {
defered.resolve(response);
}, function(err) {
defered.reject(err)
});
return defered.promise;
}
如果我在调用dataOneService和dataTwoService时没有明确地将返回值放在then的处理程序中,那么我是否有竞争条件? (因为$ q.all(promises)可以由服务完成,但是在将数据分配给范围的then处理程序之前)
我不完全理解$ q.all(承诺)何时实现。这取决于回报?
感谢您的时间。
答案 0 :(得分:0)
来自doc https://docs.angularjs.org/api/ng/service/$q
所有(许诺);
将多个承诺合并到一个在何时解决的承诺中 所有的输入承诺都得到了解决。
返回将使用数组/散列解析的单个promise 值,每个值对应于相同索引/键的promise 在promises数组/哈希中。如果任何承诺通过a解决 拒绝,由此产生的承诺将被拒绝 拒绝价值。
所以对你的问题, 我有竞争条件吗? 不,两个调用都是异步的,$ q.all()会等到所有的promise都被解析。
我完全不了解$ q.all(承诺)何时完成。这取决于收益? 是的,再次,当所有承诺都得到解决时,$ q.all()就会得到满足。
========== extra =====
我个人建议使用哈希作为承诺,这样你就可以为你的承诺命名,供以后参考。
var promises = {};
promises.promiseA = ...;
promises.promiseB = ...;
$q.all(promises).then(function(result){
console.log(result.promisesA);
console.log(result.promisesB);
});