如何从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完成之后执行下面的seq
。 node-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); } }); });