4

node-oauth https://github.com/ciaranj/node-oauthを使用して、ここhttps://dev.twitter.com/docs/misc/cursoring with javascript で指定された疑似コードを記述しようとしています。ただし、コールバック関数の性質上、カーソルが next_cursor に割り当てられることはなく、ループは永遠に実行されます。誰でもこれの回避策を考えることができますか?

module.exports.getFriends = function (user ,oa ,cb){
  var friendsObject = {};
  var cursor = -1 ;
  while(cursor != 0){
    console.log(cursor);
      oa.get(
        'https://api.twitter.com/1.1/friends/list.json?cursor=' + cursor + '&skip_status=true&include_user_entities=false'
        ,user.token //test user token
        ,user.tokenSecret, //test user secret
        function (e, data, res){
          if (e) console.error(e);
          cursor = JSON.parse(data).next_cursor;
          JSON.parse(data).users.forEach(function(user){
            var name = user.name;
            friendsObject[name + ""] = {twitterHandle : "@" + user.name, profilePic: user.profile_image_url};
          });        
          console.log(friendsObject);   
        }
      );
    }  
  }
4

2 に答える 2

6

あなたのコードが関数でラップされているとします。私はそれを と呼びgetFriendsます。

function getFriends(cursor, callback) {
  var url = 'https://api.twitter.com/1.1/friends/list.json?cursor=' + cursor + '&skip_status=true&include_user_entities=false'
  oa.get(url, user.token, user.tokenSecret, function (e, data, res) {
    if (e) console.error(e);
    cursor = JSON.parse(data).next_cursor;
    JSON.parse(data).users.forEach(function(user){
      var name = user.name;
      friendsObject[name + ""] = {twitterHandle : "@" + user.name, profilePic: user.profile_image_url};
    });        
    console.log(friendsObject);
    callback(cursor); 
  });
}

nodejs ではすべての io が非同期で行われるため、実際に を変更する前に、必要以上にループすることになりcursorます。必要なのは、Twitter API からの応答を受け取ったときだけループすることです。次のようなことができます。

function loop(cursor) {
  getFriends(cursor, function(cursor) {
    if (cursor != 0) loop(cursor);
    else return;
  });
}

を呼び出すことで開始しますloop(-1)。もちろん、これは 1 つの方法にすぎません。

必要に応じて、 asyncなどの外部ライブラリを使用できます。

于 2013-08-09T23:14:51.423 に答える
1

これにはasyncを使用することを強くお勧めします。あなたのような状況のために作られ、並行性と実行を処理します。あなたは単に非同期と同じことをする何かを書くことになり、あなただけがテストされていないでしょう.

于 2013-08-10T04:10:04.523 に答える