【问题标题】:While loop in Javascript with a Callback带有回调的 Javascript 中的 While 循环
【发布时间】:2013-08-11 23:46:27
【问题描述】:

我正在尝试使用 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);   
        }
      );
    }  
  }

【问题讨论】:

标签: javascript node.js twitter twitter-oauth


【解决方案1】:

假设你的代码被包裹在一个函数中,我称之为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

【讨论】:

  • 我是否也应该通过 cursor 来获得朋友? getFriends(光标,回调)?
  • 或者游标应该在全局空间初始化?
  • 啊,你说得对,我忘了,抱歉我现在不能测试你的代码。我编辑了我的答案以添加它。
  • @AlbertoZaccagni ,如何在前端使用异步?
【解决方案2】:

我强烈建议为此使用async。它专为像您这样的情况而设计,并为您处理并发和执行。你最终只会写一些与异步做同样事情的东西,只有你的东西不会经过测试。

【讨论】:

  • 哪种方法在异步中对此有用?我肯定会调查这个
  • 我猜它是 while(test, fn, callback) 函数
  • 是的,虽然在这种情况下应该没问题。
猜你喜欢
  • 1970-01-01
  • 2018-12-10
  • 2012-07-10
  • 2023-03-12
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
相关资源
最近更新 更多