Node.js – 使用多个查询asynchronous构buildJSON

上周我已经开始编写Node.js了。 我写了代码来生成JSON查询多个表, not sure if this is correct way of coding asynchronously

 build_actor(post, function(actor){ build_post_object(post, function(post_object){ build_post_attachments(post, function(attachments){ build_post_comments(post, function(comments){ var post_obj = {}; post_obj.actor = actor; post_obj.object = post_object; post_obj.attachments = attachments; post_obj.comments = comments; console.log(JSON.stringify(post_obj)); // generates JSON }); }); }); }); function build_actor(post, callback){ //query callback(actor); } function build_post_object(post, callback){ //query callback(post_object); } function build_post_attachments(post, callback){ //query callback(attachments); } function build_post_comments(post, callback){ //query callback(comments); } 

请让我知道是否有更好的方式来编写多个查询和build立一个JSON。

我看到你已经得到了一个答案,但我想我可以看到是否有可能使用asynchronous(应该是比原来的解决scheme更less的代码和/或更容易阅读)做一个非常优雅的解决scheme,就像一个练习。 它是:

 async.series({ actor: async.apply(build_actor, post), post_object: async.apply(build_post_object, post), attachments: async.apply(build_post_attachments, post), comments: async.apply(build_post_comments, post) }, function (err, result) { console.log(JSON.stringify(result)); }); 

build _ * – 函数还必须将callback空(或一个错误)作为第一个参数。 这通常是一个好主意,因为大多数node.js的apis和模块都是这样工作的。 例如:

 function build_actor(post, callback) { // Query callback(null, actor); } 

请注意,我没有真正testing过,但它应该工作。

所以这里的奇妙之处在于, async.series可以将结果async.series为一个对象,其中结果的键与赋值的function相同。 因此,您不需要为对象赋值,但可以直接将其转换。 async.apply只是一个调用一个已经可用参数的函数的一个更简单的方法。 简单的方法是:

 function (callback) { build_actor(post, callback); } 

另一种方法是重写你的抓取函数,如下所示:

 function build_actor(post){ return function (callback) { //query callback(null, actor); }; } 

像这样使用它们:

 async.series({ actor: build_actor(post) }, ...); 

这将是更清洁。 另请注意,如果您可以同时运行查询,则async.parallel也可以正常工作。