所以我在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和承诺的经验,但我被困住了。提前致谢。
答案 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;
}));
}
希望也有帮助!
干杯 本