$ q承诺与Underscore _各自

时间:2014-09-04 17:38:23

标签: angularjs underscore.js promise angular-promise

所以我在angularjs服务器中有一个方法,它调用一个方法,为数组中的每个方法返回一个promise。我使用下划线_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和承诺的经验,但我被困住了。提前致谢。

3 个答案:

答案 0 :(得分:8)

您想使用$q.all,它会接受一系列承诺。因此,请使用map代替each,并将结果传递给$q.all(),这会为您提供等待所有这些内容的承诺。您甚至不需要手动填充的stuff数组,但只能使用该新承诺的分辨率值。

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

答案 1 :(得分:0)

$q.all([promise1,promise2,promise3,etc])
.then(function(results){
   alert("This alert will happen after all promises are resolved.");
 })

答案 2 :(得分:0)

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

用例背景是上传后的服务器端(nodeJs)文件导入。我使用promises来返回适当的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;
    }));
}

希望也有帮助!

干杯 本