2013-08-09 4 views
2

Я пытаюсь написать Pseudocode здесь https://dev.twitter.com/docs/misc/cursoring с помощью javascript, используя node-oauth https://github.com/ciaranj/node-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); 
     } 
    ); 
    } 
    } 
+1

глядя в это прямо сейчас .. http://geekabyte.blogspot.com/2013/04/callback-functions-in-loops-in.html –

ответ

3

Предположим, что ваш код упаковывается в функции, я буду называть его 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 все И.О. делается асинхронно, так что вы будете цикл намного больше, чем нужно, прежде, чем на самом деле изменения cursor, что вам нужно, это цикл только тогда, когда вы получите ответ от API Twitter, вы могли бы сделать что-то как это:

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

Вы начинаете его по телефону loop(-1), конечно, это только один из способов сделать это.

Если вы предпочитаете использовать внешнюю библиотеку, например async.

+0

Должен ли я также проходить курсор, чтобы подружиться? getFriends (курсор, обратный вызов)? –

+0

или курсор должен быть инициализирован в глобальном пространстве? –

+0

Ах, да, вы правы. Я забыл об этом, извините, я не могу проверить ваш код прямо сейчас. Я отредактировал свой ответ, чтобы добавить это. –

1

Я настоятельно рекомендую использовать для этого async. Он создан для ситуаций, подобных вашим, и управляет параллелизмом и исполнением для вас. Вы просто закончите тем, что пишете то, что делает то же самое, что и асинхронное, только ваши не будут тестироваться.

+0

Какой метод был бы полезен для этого в async? Я определенно займусь рассмотрением этого вопроса –

+1

Я угадываю его в то время как функция (test, fn, callback) –

+0

Да, в то время как в этом случае должно быть хорошо. – diversario