在Javascript中使用回调进行While循环

在Javascript中使用回调进行While循环,javascript,node.js,twitter,twitter-oauth,Javascript,Node.js,Twitter,Twitter Oauth,我试图使用节点oauth用javascript编写这里给出的伪代码。然而,由于回调函数的性质,我担心游标永远不会分配给下一个游标,循环永远运行。有人能想出解决这个问题的办法吗 module.exports.getFriends = function (user ,oa ,cb){ var friendsObject = {}; var cursor = -1 ; while(cursor != 0){ console.log(cursor); oa.get(

我试图使用节点oauth用javascript编写这里给出的伪代码。然而,由于回调函数的性质,我担心游标永远不会分配给下一个游标,循环永远运行。有人能想出解决这个问题的办法吗

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);   
        }
      );
    }  
  }

假设您的代码被包装在一个函数中,我将其称为
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都是异步完成的,因此在实际更改
光标之前,您需要的是循环,仅当您收到来自Twitter API的响应时,您可以执行以下操作:

function loop(cursor) {
  getFriends(cursor, function(cursor) {
    if (cursor != 0) loop(cursor);
    else return;
  });
}
您可以通过调用
循环(-1)
来启动它,当然这只是一种方法


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

我强烈建议使用。它专为您这样的情况设计,为您处理并发和执行。您只需编写一些与async相同的东西,只有您的东西不会被测试。

现在就开始研究。。我是否也应该在“获取朋友”中传递光标?getFriends(游标,回调)?或者游标应该在全局空间中初始化?啊,是的,你是对的,我忘了,对不起,我现在不能测试你的代码。我编辑了我的答案来添加它。@AlbertoZaccagni,我如何在前端使用async?在async中,哪种方法对此有用?我肯定会对此进行研究,我想这是while(test,fn,callback)函数是的,while在这种情况下应该可以。