4

我正在尝试使用 node-oauth https://github.com/ciaranj/node-oauth 使用 JavaScript 编写此处给出的代码https://dev.twitter.com/docs/misc/cursoring。但是我担心由于回调函数的性质,光标永远不会分配给 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),当然这只是一种方法。

如果您愿意,可以使用外部库,例如async

于 2013-08-09T23:14:51.423 回答
1

我强烈建议为此使用异步。它专为像您这样的情况而设计,并为您处理并发和执行。您最终只会编写与异步执行相同操作的内容,只有您的内容不会经过测试。

于 2013-08-10T04:10:04.523 回答