Q Promise Nodejs how to resolve in a loop

I have code written in nodejs making me get confused using Q Promises

 theFunction() .then(function(data) { var deferred = Q.defer() var result = []; for(i=0; i < data.length; i++) { secondFunc(data.item) .then(function(data2) { data.more = data2.item }); result.push(data); } deferred.resolve(result); deferred.promise(); }); 

I want the data in the second function inside the loop to be able to insert the result

so my previous data is like this

 [ { id: 1, item: 1, hero: 2 }, { id: 1, item: 1, hero: 2 } ] 

and like it so much

 [ { id: 1, item: 1, hero: 2, more: { list: 1 } }, { id: 1, item: 1, hero: 2, more: { list: 4 } } ] 

I tried several ways to start by entering the Delayed Resource () command; operator in a loop and showing only 1 data is there any solution?

+7
promise loops q
source share
2 answers

Instead of deferred.resolve() in an array that will be fixed immediately, use Q.all , which waits for the array from promises:

 theFunction() .then(function(data) { var result = []; for(var i=0; i < data.length; i++) (function(i){ result.push(secondFunc(data[i].item) .then(function(data2) { data[i].more = data2.item; return data[i]; })); })(i); // avoid the closure loop problem return Q.all(result) }); 

Or even better:

 theFunction() .then(function(data) { return Q.all(data.map(function(item) return secondFunc(item) .then(function(data2) { item.more = data2.item; return item; }); }); }); 
+9
source share

I know this is an older post, but I have the same problem and no solution was found. Maybe someone here will find a good solution very quickly.

 function CompareTeamspeakClients(forumUsers) { var promises = []; var tsClient = new TeamSpeakClient("127.0.0.1", 10011); tsClient.send("login", { client_login_name: "serveradmin", client_login_password: "M+h8YzUA" }, function(err, response){ if (err) deferred.reject(err); }); tsClient.send("use", { port: 9987 }, function(err, response){ if (err) deferred.reject(err); }); forumUsers.forEach(function(user, index){ var deferred = Q.defer(); tsClient.send("clientdbfind", ["uid"], { pattern: user.tsid }, function(err, response){ if (err) deferred.reject(err); if (response) { tsClient.send("clientdbinfo", { cldbid: response.cldbid }, function(err, response){ if (err) deferred.reject(err); forumUsers[index]['tsdbid'] = response.client_database_id; forumUsers[index]['tsnickname'] = response.client_nickname; forumUsers[index]['tslastconnected'] = response.client_lastconnected; deferred.resolve(forumUsers); }); } }); promises.push(deferred.promise); }); console.log(promises); return Q.all(promises); } 
0
source share

All Articles