2
geturls(data,function(urls){
    var data = {
        "data": [
            { "userProfile": userP },
            { "urls": urls }
        ]
    };
    res.send(data);
});


function getUrls(data,done){

    links = new Array();

    for (var i=0; i<data.length; i++){
        user = data[i]
        Url.find({where:{data.id}}).success(function(url){
            links.push({
                "url": ur.text,
                "date": data.syncedTime
            });

            if (urls.length == data.length){
                done(links);
            }
        });
    }
}

私のコードの問題は次のとおりです。

配列に収集されたデータが親配列の長さと等しくなると、コールバックを介して応答を返します。これは明らかに非常に危険で、洗練されたソリューションではありません。たとえば、Url データベースから .failure を取得すると、urls.length は data.length と等しくなりません。だから、私はこれをどうするかについて少し混乱しています。何か助けはありますか?

4

4 に答える 4

1

を使えば簡単ですasync.js

ここを利用mapSeriesしました。3 つのパラメーターが必要です。

  • コレクション/配列
  • 渡されたコレクション/配列の各アイテムに対して 2 つの引数で呼び出されるイテレータ。1. コレクション内のアイテム、2. コールバック。イテレータでジョブを完了した後、ノード スタイルでコールバックを呼び出す必要があります (最初にエラー、結果が続きます)。
  • コレクション内のすべてのアイテムがマップされた後に呼び出される最終コールバック。

function getUrls(data,done){

  var async = require('async');

  async.mapSeries(data, function(user, cb) {//If you want it to be async `async.map`

    Url.find({where:{user.id}}).success(function(url){
      cb(null, {
            "url": url.text,
            "date": user.syncedTime
      });
    });
  }, function(err, results) {
    //results is an array. Its the same as `links` in your old code.
    done(results);
  });

}

geturls(data,function(urls){
  var data = {
    "data": [
        { "userProfile": userP },
        { "urls": urls }
    ]
  };
  res.send(data);
}); 
于 2013-06-29T07:19:08.003 に答える
1

再帰を使用します。

function getUrls(data,done) {
    var links = new Array();

    function doGetUrl(i) {
        var user = data[i];
        Url.find({where:{data.id}}).
        success(function(url){
            links.push({
                "url": ur.text,
                "date": data.syncedTime
            });

            if (links.length == data.length){
                done(links);
            } else {
                doGetUrl(i + 1); // get next url
            }
        }).
        failure(function(err) {    
            doGetUrl(i); // on error, try to get current url again
            // other error handling code
        });
    }

    doGetUrl(0);
}
于 2013-06-29T06:36:12.153 に答える