Q Promise Nodejs comment résoudre en boucle

j’ai du code écrit en nodejs me rend confus en utilisant 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(); }); 

Je veux des données en deuxième fonction dans la boucle peut pousser dans le résultat

donc mes données précédentes sont comme ça

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

et ainsi de suite

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

J’ai essayé plusieurs manières, en commençant par entrer la commande deferred.resolve (); déclaration dans la boucle et ne montrant que 1 données ont une solution?

    Au lieu d’un deferred.resolve() sur un tableau qui résoudra immédiatement, utilisez Q.all qui attend un tableau de promesses:

     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) }); 

    Ou même mieux:

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

    Je sais que c’est un article plus ancien, mais j’ai le même problème et je n’ai trouvé aucune solution. Peut-être que quelqu’un ici trouvera une bonne solution très rapidement.

     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); }