Node.js - 与多个查询异步构建JSON

时间:2013-08-26 05:38:53

标签: javascript node.js asynchronous

我上周开始在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,请告诉我。

1 个答案:

答案 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也可以正常运行。