javascript - 递归异步 api 调用

标签 javascript node.js asynchronous recursion

我正在从事一个需要使用 Twitter API 的项目。试图返回给定用户的所有关注者。问题是让所有用户 bc twitter 将关注者分成最多 200 个 block 。

我在网上看到一个解决方案,他们递归地调用回调,但是我在尝试使用 promises 来获取所有数据之前遇到困难,然后再继续。目前它等待第一页返回,但不知道如何让它等待所有 promise 返回。 有人可以给我任何提示/技巧吗?是否有办法迭代地执行此操作?

let cursor = -1;
let promise = new Promise((resolve,reject)=>{
      twitter.followers({cursor},function callback(data, error){
       if(error)
           reject(false)
      cursor = data.next_cursor;
      if(cursor!=0){
           new Promise((resolve,reject)=>{
                twitter.followers({cursor},callback)
           })
           resolve(true);
      }
})
})
promise.then({
    //do stuff
})

最佳答案

你很接近,但你的方法只需要一些调整:

  • 当出现错误时,除了reject()
  • 之外不要做任何事情
  • 不要创建新的嵌套 promise ,而是使用当前 promise :将 resolve()(或 reject())的任何调用延迟到下一个调用回调。
  • 仅在光标到达 0 时执行 resolve()
  • 最后的 then 需要一个回调参数,而不是对象字面量。

这是调整后的代码(使用 twitter.followers 的虚拟实现来使其工作):

// Mock implementation, for the snippet to work:
var twitter = {
    followers: function (obj, callback) {
        setTimeout(function () {
            callback({
                next_cursor: (obj.cursor + 5) % 6
            }, 0);
        }, 100);
    }
}

let cursor = -1;
let promise = new Promise((resolve,reject)=>{
    twitter.followers({cursor}, function callback(data, error){
        if (error) {
            reject(false)
            return; // Don't continue after error
        }
        cursor = data.next_cursor;
        console.log(cursor);
        if (cursor != 0){
            // Don't create a new promise, just delay to resolve
            twitter.followers({cursor}, callback)
            return; // don't resolve now
        }
        resolve(true);
    })
})
promise.then(function () { // You need a callback function here
    console.log('all done');
})

关于javascript - 递归异步 api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44213755/

相关文章:

javascript - 在它之前创建带有一些文本的动态链接

javascript - 异步方法总是返回未定义

multithreading - NCompBus和WCF间歇性地无法完成TaskCompletionSource

javascript - 有没有办法打印 PDF 但手动设置值而不是从主 HTML 中获取它们?

php - 如何调试 Javascript + PHP + Web 服务

javascript - 通过鼠标调整图像大小

javascript - 这个 var 猜测 = 需要 ('myModule1' ) ('myMmodule2' );做?

javascript - 使用 node.js 写入二进制数据的问题

javascript - 循环访问 http 方法数组

iphone - 我们有什么理由不使用 UIImageView 的子类吗?