循环中的Strongloop承诺

时间:2015-12-11 12:07:27

标签: angularjs promise angular-promise loopbackjs strongloop

我试图在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的值,使用它做一些工作,然后移动到下一个国家/地区。我觉得我很接近,但我无法理解我将如何编写这个特定的功能。非常感谢任何帮助。

1 个答案:

答案 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')});