【问题标题】:$q promise with Underscore _each$q 承诺下划线 _each
【发布时间】:2014-10-29 13:46:24
【问题描述】:

所以我在 angularjs 服务器中有一个方法,该方法正在调用一个方法,该方法为数组中的每个方法返回一个承诺。我正在使用下划线 _each 循环遍历数组。我想等到整个数组都处理完后,再调用方法中的最后一行代码..

所以...

function ProcessCoolStuff(coolStuffs)
{
 var stuff = [];
 _.each(coolStuffs, function(coolStuff)
 {
   //Some method using $q to return 
   makeStuffCooler(coolStuff).then(function(coolerStuff)
  {
   stuff.push(coolerStuff);
  });
 });
 //Maybe Call a Display Method, or call event ect.. 
 ShowAllMyCoolStuff(stuff);
}

这当然行不通。循环完成并在每个项目的 makeStuffCooler 完成之前调用“ShowAllMyCoolStuff”。那么..与异步方法交互的正确方法是什么,所以我的 ShowAllMyCoolStuff 方法将等到填充集合?这可能是我对 $q 和一般承诺缺乏经验,但我被困住了。提前致谢。

【问题讨论】:

  • 值得注意的是,如果您的浏览器运行 Angular,您可能可以依靠它来拥有 Array.prototype.forEach 和 Array.prototype.map。但是,是的,$q.all 就是它所在的位置。

标签: angularjs underscore.js promise angular-promise


【解决方案1】:

您想使用$q.all,它接受一组承诺。所以使用map而不是each,并将结果传递给$q.all(),这会给你一个等待所有这些的承诺。您甚至不需要手动填充的 stuff 数组,而是可以使用新承诺的分辨率值。

function processCoolStuff(coolStuffs) {
    return $q.all(_.map(coolStuffs, makeStuffCooler));
}
processCoolStuff(…).then(showAllMyCoolStuff);

【讨论】:

  • 很好,谢谢。这正是我所需要的。我认为它与 $q.all 有关。还有 +1 摆脱手动填充的数组。
【解决方案2】:
$q.all([promise1,promise2,promise3,etc])
.then(function(results){
   alert("This alert will happen after all promises are resolved.");
 })

【讨论】:

    【解决方案3】:

    在我阅读了问题和相应的答案后,我走上了正确的道路。到目前为止感谢!但是对于最终的工作解决方案,我又花了一个小时让所有用例都正常工作。这就是为什么我想分享一个包含链式承诺的代码示例,其中包括一系列等待解决的承诺。

    用例背景是上传后的服务器端(nodeJs)文件导入。我使用 Promise 来返回适当的 http 状态和结果。

    readFile: function (fileName) {
        if (fileName) {
            var deferred = Q.defer();
            var self = this;
            converter({input: fileName}, function (error, userData) {
                if (error) {
                    deferred.reject(error);
                }
                self.storeUsers(error, userData)
                    .then(function (success) {
                        if (success) {
                            deferred.resolve(success)
                        }
                    })
                    .fail(function (error) {                       
                        deferred.reject(error)                      
                    });
            });
            return deferred.promise;
        }
    },
    
    storeUsers: function (error, data) {
        return Q.all(_.map(data, function (users, emailAddress) {
            var deferred = Q.defer();
            userRepository.findUserByEmail(emailAddress, function (user) {
                //...
                user.save(function (error) {
                    if (error) {
                        deferred.reject(error);
                    } else {
                        deferred.resolve(emailAddress);
                    }
                });
    
            });
            return deferred.promise;
        }));
    }
    

    希望这也有帮助!

    干杯 本

    【讨论】:

      猜你喜欢
      • 2015-02-25
      • 2015-05-12
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 2015-04-15
      • 2015-04-08
      • 2013-09-11
      • 2012-12-14
      相关资源
      最近更新 更多