我上周开始在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);
}
如果有更好的方法来编写多个查询和构建JSON,请告诉我。
答案 0 :(得分:1)
我看到你已经得到了答案,但我想我能看出是否有可能使用异步制作一个非常优雅的解决方案(应该是比原始解决方案更少的代码和/或更容易阅读),就像一个行使。它是:
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 _ * - 函数还必须回调null(或错误)作为第一个参数。这通常是个好主意,因为大多数node.js的apis和模块都是这样工作的。例如:
function build_actor(post, callback) {
// Query
callback(null, actor);
}
请注意,我实际上没有对其进行过测试,但它应该有效。
所以这里的神奇之处在于async.series
可以将结果组成一个对象,其中结果的键与分配函数的键相同。因此,您不需要为对象赋值,但可以直接转换它。 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
也可以正常运行。