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.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 に答える