1

上周我开始使用 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。

4

1 回答 1

1

我看到你已经得到了答案,但我想我可以看看是否可以使用 async 制作一个非常优雅的解决方案(应该比原始解决方案更少的代码和/或更容易阅读),就像一个练习一样。它是:

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 的 api 和模块都是这样工作的。例如:

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也可以正常工作。

于 2013-08-26T07:07:43.033 回答