Javascript Node.js Twitter API游标

Javascript Node.js Twitter API游标,javascript,node.js,twitter,Javascript,Node.js,Twitter,我用它来获取特定帐户的关注者 Twitter API从单个GET请求返回多达5000个结果 如果我查询的用户有超过5000个追随者,则会随数据返回一个“next_cursor”值 为了获得接下来的5000个结果,我需要重新运行get函数,将“next_cursor”值作为参数传递给它。我就是不知道怎么做 我在考虑一个while循环,但是我不能重置全局变量,我认为是因为范围: var cursor = -1 while ( cursor != 0 ) { T.get('followers

我用它来获取特定帐户的关注者

Twitter API从单个GET请求返回多达5000个结果

如果我查询的用户有超过5000个追随者,则会随数据返回一个“next_cursor”值

为了获得接下来的5000个结果,我需要重新运行get函数,将“next_cursor”值作为参数传递给它。我就是不知道怎么做

我在考虑一个while循环,但是我不能重置全局变量,我认为是因为范围:

var cursor = -1

while ( cursor != 0 ) { 

  T.get('followers/ids', { screen_name: 'twitter' },  function (err, data, response) {

  // Do stuff here to write data to a file

  cursor = data["next_cursor"];

  })

}

显然我不是JS天才,因此非常感谢您的帮助。

您遇到的问题是由于Node.JS是异步的

T.get('followers/ids', { screen_name: 'twitter' },  function getData(err, data, response) {

  // Do stuff here to write data to a file

  if(data['next_cursor'] > 0) T.get('followers/ids', { screen_name: 'twitter', next_cursor: data['next_cursor'] }, getData);

  })

}
请注意:

  • 我给内部回调函数起了个名字。这样我们就可以从内部递归地调用它
  • 循环将替换为递归回调
  • 如果有下一个光标数据,那么我们使用相同的函数调用
    getData
  • 请注意,Do stuff here代码将执行多次(只要有下一个游标)。因为它是递归回调,所以顺序是有保证的


    如果您不喜欢递归回调的想法,可以通过以下方式避免:

  • 如果可能,提前找出所有下一个光标,并使用for循环生成请求
  • 或者,使用异步助手模块,如(尽管出于学习目的,我会避免使用模块,除非您已经熟练掌握了该概念)

  • 与这一次搏斗。。一切似乎都正常,但数据['next_cursor']从未改变

    代码应该是这样的:

    T.get('followers/ids', { screen_name: 'twitter' },  function getData(err, data, response) {
    
      // Do stuff here to write data to a file
    
      if(data['next_cursor'] > 0) T.get('followers/ids', { screen_name: 'twitter', cursor: data['next_cursor'] }, getData);
    
      })
    
    }
    

    Twit的参数不是“下一个光标”,它只是“光标”)

    考虑使用5K+帐户进行测试

        const T = new Twit(tokens)
    
        function getFollowers (screenName, followers = [], cur = -1) {
          return new Promise((resolve, reject) => {
            T.get('followers/ids', { screen_name: screenName, cursor: cur, count: 5000 }, (err, data, response) => {
              if (err) {
                cur = -1
                reject(err)
              } else {
                cur = data.next_cursor
                followers.push(data.ids)
                if (cur > 0) {
                  return resolve(getFollowers(screenName, followers, cur))
                } else {
                  return resolve([].concat(...followers))
                }
              }
            })
          })
        }
    
        async function getXaqron () {
          let result = await getFollowers('xaqron')
          return result
        }
    
     console.log(getXaqron().catch((err) => {
      console.log(err) // Rate limit exceeded
    }))
    

    非常感谢你的帮助。这对我来说很有意义(当然也很有效)。我曾调查过Async,但觉得自己可能像你所说的那样走在了前面。