我试图在for循环中调用一个loopback find函数,将一个值从迭代传递到loopback函数。代码的主要问题可以表示如下:
for (var a = 0; a < $scope.countries.length; a++) {
$scope.getEmFacPurElec($scope.countries[a], 'ton/kWh', 'CO2e').then(function(result) {
emFacPurElecToUse = $scope.emFacPurElecs;
}
以下是被调用的函数:
$scope.getEmFacPurElec = function (country, unit, ghgType) {
var defer = $q.defer();
$scope.emFacPurElecs = [];
$scope.emFacPurElecs = Country.emFacPurElecs({
id: country.id,
filter: {
where: {
and: [
{unit: unit},
{ghgType: ghgType}
]
}
}
});
defer.resolve('Success getEmFacPurElec');
return defer.promise;
};
问题是调用了loopback promise函数,然后返回undefined,这意味着它在获取赋值给emFacPurElecToUse的值之前移动到for循环的下一次迭代。在转移到下一个国家之前,我需要为该国家的那个变量做更多的计算。
我已经看过使用$ q.all作为一种可能的解决方案,并且根据http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html使用array.map(Rookie错误#2:WTF,我如何使用带有promises的forEach()?),但是我只是无法弄清楚如何将它们全部拉到一起以使其工作。我应该使用forEach吗?
我也看到了这个链接angular $q, How to chain multiple promises within and after a for-loop(以及其他类似的链接),但我没有需要在for循环中处理的多个promise。我需要为该国家检索一个emFacPurElecs的值,使用它做一些工作,然后移动到下一个国家/地区。我觉得我很接近,但我无法理解我将如何编写这个特定的功能。非常感谢任何帮助。
答案 0 :(得分:0)
在我看来,你确实有多个承诺要在你的for循环中处理,就像你说的那样#34;我需要在移动到下一个国家之前用该变量为该国家做更多的计算。&#34 ;这应该都是在我建议的承诺链中完成的 - calcEmFacPurElec
。
$scope.calcEmFacPurElec = function (country, unit, ghgType) {
$scope.getEmFacPurElec(country, unit, ghgType).then(function(countryEmFacPurElecs) {
// do something with countryEmFacPurElecs
return countryEmFacPurElecs;
}
$scope.getEmFacPurElec = function (country, unit, ghgType) {
var defer = $q.defer();
defer.resolve(Country.emFacPurElecs({
id: country.id,
filter: {
where: {
and: [
{unit: unit},
{ghgType: ghgType}
]
}
}
}); );
return defer.promise;
};
希望以上是指向正确方向的指针!
当你想在一系列项目上执行一个承诺链时,就像你已经确定的那样,Promise.all(使用你需要的任何promises实现)就是你想要的。 .all接受一个Promises数组,所以在你的for循环中你可以这样做:
var promises = [];
for (var a = 0; a < $scope.countries.length; a++) {
promises.push($scope.calcEmFacPurElec($scope.countries[a], 'ton/kWh', 'CO2e')); // new promise chain that does all of the work for that country
}
$q.all(promises).then(function(arrayofCountryEmFacPurElecs) {console.log('all countries completed')});