0

私は node.js にかなり慣れていないので、関数が内部コールバックを使用して Underscore _.each() ブロックを待機するようにプログラム フローを制御する方法を理解できません。凶悪なコールバック シチューは避けたいと思います。このブロックは、すでに nimble の .series([]) によって制御されているチェーンにあります

function (callback) { //get common friends    
    _.each(User.friends, function (friend) { //I NEED THE FLOW TO WAIT TIL THIS COLLECTION HAS ITERATED AND ALL THE CALLBACKS ARE COMPLETE
        request.get({
            url: 'https://graph.facebook.com/me/mutualfriends/' + friend.id + '?access_token=' + User.accessToken,
            json: true
        }, function (error, response, body) { //NEED TO WAIT TIL THESE ARE ALL COMPLETED
            if (!error && response.statusCode == 200) {
                console.log("common friends", body.data);

            } else {
                console.log(error);
            }
        });

    }, this);

    callback(); //Nimble's serialization callback fires immediately
},

async.each を使用するために以下の提案を試みましたが、反復完了コールバックを起動して、nimble の .series 関数に次のブロックに進むように指示することができません。

async.each(User.friends, function(friend) {
        request.get({
        url: 'https://graph.facebook.com/me/mutualfriends/'+friend.id+'?access_token=' + User.accessToken,
        json: true
        }, function (error, response, body) { //NEED TO WAIT TIL THESE ARE ALL COMPLETED
            if (!error && response.statusCode == 200) {
                console.log("common friends",body.data);

            } else {
                console.log(error);
            }
        });


    },function(err) {console.log('Final callback');callback();}); //THIS CALLBACK DOESN'T FIRE - NIMBLE JUST SITS AND WAITS
4

3 に答える 3

2

asyncそのためにモジュールを使用できます。

async.each

コードは次のようになります。

async.each(User.friends, function(friend, cb) {
  var req = {
    url: 'https://graph.facebook.com/me/mutualfriends/'+friend.id+
      '?access_token='+User.accessToken,
    json: true
  };
  request.get(req, function(err,response,body) {
    if(err) { console.log(err); cb(true); return; }
    console.log("common friends",body.data);
    // each function call has to finish by calling `cb`
    cb(false);
  });
},
function(err) {
  if(err) return;
  console.log('Final callback');
  callback(); // here is your final callback
}
);
于 2013-06-10T02:07:36.743 に答える
1

あなたのコードはほぼ正しいものでした。コールバック関数を渡して使用する必要があります。そうしないと、Async は最後のコールバックをいつ呼び出すかわかりません。

async.each(User.friends, function(friend, cb) {
    request.get({
        url: 'https://graph.facebook.com/me/mutualfriends/' + friend.id + '?access_token=' + User.accessToken,
        json: true
    }, function(error, response, body) { //NEED TO WAIT TIL THESE ARE ALL COMPLETED
        if (!error && response.statusCode == 200) {
            console.log("common friends", body.data);
            cb(null);
        } else {
            console.log(error);
            callback(error);
        }
    });
}, function(err) {
    console.log('Final callback', err);
    callback();
});
于 2013-06-10T09:21:17.847 に答える
1

これを試して。

function (callback) { //get common friends  
 var completeCount = 0;  
  _.each(User.friends, function (friend) { 
    request.get({
        url: 'https://graph.facebook.com/me/mutualfriends/' + friend.id + '?access_token=' + User.accessToken,
        json: true
    }, function (error, response, body) { //NEED TO WAIT TIL THESE ARE ALL COMPLETED
        if (!error && response.statusCode == 200) {
            console.log("common friends", body.data);

        } else {
            console.log(error);
        }

        completeCount++;

        // complete count check           
        if( completeCount === User.friends.length ){
           callback()
        }
    });

  }, this);    
},
于 2013-06-10T06:52:12.047 に答える