我正在从事一个需要使用 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/