【发布时间】:2016-03-17 08:18:48
【问题描述】:
我正在尝试在 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(新手错误 #2:WTF,我如何使用 forEach() 和 promise?),但我只是无法弄清楚如何将它们组合在一起以使其工作。我应该改用 forEach 吗?
我还看到了这个链接angular $q, How to chain multiple promises within and after a for-loop(以及其他类似的链接),但我没有需要在 for 循环内处理的多个承诺。我需要检索该国家/地区的一个 emFacPurElecs 的值,对其进行一些处理,然后移至下一个国家/地区。我觉得我很接近,但我无法理解如何编写这个特定的功能。非常感谢任何帮助。
【问题讨论】:
-
如果您最终考虑用 Angular 中的另一个 Promise 库替换 Q,您可以考虑使用 github.com/mattlewis92/angular-bluebird-promises,因为这就是我曾经利用 bluebird 的
map()方法用于类似于您描述的用例的方法。参考:bluebirdjs.com/docs/api/promise.map.html
标签: angularjs promise angular-promise loopbackjs strongloop