While loop in Javascript with a Callback

javascript, node.js, twitter, twitter-oauth

Solution

Suppose your code is wrapped in a function, I'll call it `getFriends`, basically it wraps everything inside the loop.

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

In nodejs all io is done asynchronously, so you will loop a lot more than needed, before actually changing `cursor`, what you need is loop only when you receive a response from the Twitter API, you could do something like this:

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

You start it by calling `loop(-1)`, of course this is just one way of doing it.

If you prefer you could use an external library, like async.

Problem

I am trying to write the Pseudocode given here https://dev.twitter.com/docs/misc/cursoring with javascript using node-oauth https://github.com/ciaranj/node-oauth. However I am afraid because of the nature of the callback functions the cursor is never assigned to the next_cursor and the loop just runs forever. Can anyone think a workaround for this? ``` 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); } ); } } ```

Original source