while 循环中的异步方法与 Graph API 分页
Asynchronous method in while loop with Graph API paged
我正在为 node.js 使用 facebook node sdk 从 Facebook 用户那里获取信息,例如他们的 Feed 和朋友,这工作正常。
但是我遇到了返回数据被分页的问题 - 我需要在递归模式下构建一些东西。让我解释一下:
FB.api('/me/feed?limit=5000', {
access_token: token
}, function(response) {
// response is an object that could have as response.paging.next attribute
});
限制在这里不起作用,因为它 returns 最多 245 和 returns 分页 对象指示下一页结果。
因为下一次调用取决于上一次异步调用的结果,所以我尝试这样做:
// first call before
var hasNext = response.paging.next ? true : false;
while (hasNext){
FB.api('/me/feed', {
access_token: token
}, function(response_paged) {
response.data.concat(response_paged.data);
// If do not have a next page to break the loop
if (!response_paged.paging.next) hasNext = false;
});
}
下一个令牌的获取方式暂时不重要
重点是我试图在递归模式下进行异步调用,但它不起作用,这样我就会陷入无限循环。
我用 async/await 解决这个问题的想法:
async function getFeed(token) {
let feedItems = [],
hasNext = true,
apiCall = '/me/feed';
while (hasNext) {
await new Promise(resolve => {
FB.api(apiCall, {access_token: token}, (response) => {
feedItems.concat(response.data);
if (!response.paging.next) {
hasNext = false;
} else {
apiCall = response.paging.next;
}
resolve();
});
});
}
return feedItems;
}
getFeed().then((response) => {
console.log(response);
});
请注意,为此您需要 Node.js 7.9.0+:http://node.green/
对于旧版本,安装这个:https://github.com/yortus/asyncawait
您也可以使用递归函数,但是 smooth/modern 方法是 async/await。
而不是使用:
feedItems.concat(response.data);
我做了:(如果是的话response.data有数据)
for(var i in response.data){
feedItems.push(response.data[i]);
}
截至今天 (12/10/21) response.data 是对象类型。以下内容现在适合保存响应数据。
for (let d of response.data) {
feedItems.push(d)
}
我正在为 node.js 使用 facebook node sdk 从 Facebook 用户那里获取信息,例如他们的 Feed 和朋友,这工作正常。
但是我遇到了返回数据被分页的问题 - 我需要在递归模式下构建一些东西。让我解释一下:
FB.api('/me/feed?limit=5000', {
access_token: token
}, function(response) {
// response is an object that could have as response.paging.next attribute
});
限制在这里不起作用,因为它 returns 最多 245 和 returns 分页 对象指示下一页结果。
因为下一次调用取决于上一次异步调用的结果,所以我尝试这样做:
// first call before
var hasNext = response.paging.next ? true : false;
while (hasNext){
FB.api('/me/feed', {
access_token: token
}, function(response_paged) {
response.data.concat(response_paged.data);
// If do not have a next page to break the loop
if (!response_paged.paging.next) hasNext = false;
});
}
下一个令牌的获取方式暂时不重要
重点是我试图在递归模式下进行异步调用,但它不起作用,这样我就会陷入无限循环。
我用 async/await 解决这个问题的想法:
async function getFeed(token) {
let feedItems = [],
hasNext = true,
apiCall = '/me/feed';
while (hasNext) {
await new Promise(resolve => {
FB.api(apiCall, {access_token: token}, (response) => {
feedItems.concat(response.data);
if (!response.paging.next) {
hasNext = false;
} else {
apiCall = response.paging.next;
}
resolve();
});
});
}
return feedItems;
}
getFeed().then((response) => {
console.log(response);
});
请注意,为此您需要 Node.js 7.9.0+:http://node.green/
对于旧版本,安装这个:https://github.com/yortus/asyncawait
您也可以使用递归函数,但是 smooth/modern 方法是 async/await。
而不是使用:
feedItems.concat(response.data);
我做了:(如果是的话response.data有数据)
for(var i in response.data){
feedItems.push(response.data[i]);
}
截至今天 (12/10/21) response.data 是对象类型。以下内容现在适合保存响应数据。
for (let d of response.data) {
feedItems.push(d)
}