Q承诺Nodejs如何在循环中解决

我有写在nodejs的代码让我混淆使用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(); }); 

我想第二个函数里面的数据循环可以推入结果

所以我以前的数据是这样的

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

像这样

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

我已经尝试了几种方法,首先input命令deferred.resolve(); 语句在循环中只显示1个数据有什么解决办法?

而不是立即解决的数组deferred.resolve() ,使用Q.all等待承诺的数组:

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

甚至更好:

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

我知道这是一个较旧的post,但我有同样的问题,没有find任何解决scheme。 也许有人在这里find一个很好的解决scheme。

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