如何从forEach函数聚合json对象的数组?

我想渲染node.js中所有项目的故事。 怎么做?

app.get('/stories', function(request, response) { var projects_ids = [1,2]; project_ids.forEach(function(id) { pivotal.getStories(id, function(err, project_stories) { console.log("Stories: " + project_stories); return JSON.stringify(project_stories); }); }); response.send(array_of_stories); }); 

在日志中我得到:

 Stories: [object Object] Stories: [object Object] 

由于getStories是asynchronous的(根据getStories的方法签名进行getStories ), getStories您当前的方法将不起作用。 如果可以的话,我build议你创build一个pivotal的方法,可以为多个项目ID获取故事,所以你的代码将会是:

 app.get('/stories', function(req, res) { var project_ids = [1, 2]; pivotal.getStories(project_ids, function(err, project_stories) { res.send(project_stories); } }); 

如果这不是一个选项,我build议你看一下stream程库,例如node-seq 。 那么你的代码可以读取这样的内容:

 app.get('/stories', function(req, res) { var project_ids = [1, 2]; Seq(project_ids) .parEach(function(project_id) { pivotal.getStories(project_id, this); }) .seq(function() { var aggregatedStories = []; Hash.map(this.args, (function(arg) { // Each parSeq aparently results in an array of objects aggregatedStories.push(arg[0]); })); res.send(aggregatedStories); }); }); 

Hash.map函数来自一个叫做Hash.map的节点模块

编辑:再详细一点, parEach将并行地执行这些函数,并且在并行执行的所有callback完成之后执行下面的seqnode-seq将每个并行执行的结果放到下面的seq的参数数组中,因此有点神秘的Hash.map(this.args)

您希望您的服务器发送一个project_stories对象的数组作为对请求的响应? 我不知道你的返回语句返回到哪里,所以省略了,我会尝试类似于以下内容来发送一个对象数组作为对请求的响应。 编辑:正如其他人指出的, .getStories是asynchronous的。 也许你可以试试, caolan的asynchronous模块 。 像这样实现:

 var async = require('async'); var array_of_stories = []; var getStories = function(id, callback) { pivotal.getStories(id, function(err, project_stories) { array_of_stories.push(project_stories); }); } app.get('/stories', function(request, response) { var projects_ids = [1,2]; async.forEach(project_ids, getStories, function(error) { if(!error){ response.send(array_of_stories); } }); });