1

node.js のすべてのプロジェクトからストーリーの配列をレンダリングしたいと考えています。どうやってするか?

app.get('/stories', function(request, response) {
  var projects_ids = [1,2]; 
  project_ids.forEach(function(id) {
    pivotal.getStories(id, function(err, project_stories) {
      console.log("Stories: " + project_stories);

      return JSON.stringify(project_stories);
    });
  });
  response.send(array_of_stories);
});

ログで私は得る:

Stories: [object Object]
Stories: [object Object]
4

2 に答える 2

1

getStories は非同期であるため、現在のアプローチは機能しません ( のメソッド シグネチャに基づく仮定getStories)。可能であれば、複数のプロジェクト ID のストーリーを取得できるメソッドを作成することをお勧めしますpivotal。コードは次のようになります。

app.get('/stories', function(req, res) {
    var project_ids = [1, 2];
    pivotal.getStories(project_ids, function(err, project_stories) {
        res.send(project_stories);
    }
});

それができない場合は、 node-seqなどのフロー ライブラリを調べることをお勧めします。次に、コードを次のように読み取ることができます。

app.get('/stories', function(req, res) {
    var project_ids = [1, 2];
    Seq(project_ids)
        .parEach(function(project_id) {
            pivotal.getStories(project_id, this);
        })
        .seq(function() {
            var aggregatedStories = [];
            Hash.map(this.args, (function(arg) {
            // Each parSeq aparently results in an array of objects
                aggregatedStories.push(arg[0]);
            }));
            res.send(aggregatedStories);
        });
});

Hash.map関数は、と呼ばれるノードモジュールからのものですhashish

編集: もう少し詳しく説明parEachすると、関数が並列にseq実行され、並列実行からのすべてのコールバックが終了した後に以下が実行されます。node-seq各並列実行の結果を次のパラメーター配列に入れますseqHash.map(this.args)

于 2013-03-29T19:00:09.513 に答える
0

project_storiesサーバーがリクエストへのレスポンスとしてオブジェクトの配列を送信するようにしますか? return ステートメントがどこに返されるかわからないので、次のようなことを省略して、オブジェクトの配列をリクエストへの応答として送信します。編集:他の人が指摘したように、.getStories非同期です。caolan の async moduleを試してみるのもいいかもしれません。次のように実装します。

var async = require('async');
var array_of_stories = [];

var getStories = function(id, callback) {
  pivotal.getStories(id, function(err, project_stories) {
    array_of_stories.push(project_stories);
  });
}

app.get('/stories', function(request, response) {
  var projects_ids = [1,2];
  async.forEach(project_ids, getStories, function(error) {
    if(!error){
      response.send(array_of_stories);
    }
  });
});
于 2013-03-29T18:53:30.800 に答える