Luc*_*sta 1 javascript asynchronous node.js facebook-javascript-sdk facebook-node-sdk
我正在使用针对node.js的facebook节点sdk从Facebook用户获取信息,例如其供稿和朋友,这很好。
但是我遇到的问题是分页返回的数据-我需要以递归模式构建一些东西。让我解释:
FB.api('/me/feed?limit=5000', {
access_token: token
}, function(response) {
// response is an object that could have as response.paging.next attribute
});
Run Code Online (Sandbox Code Playgroud)
Limit在这里不起作用,因为它返回的最大值为245,并返回指示下一页结果的分页对象。
因为下一个调用取决于上一个异步调用的结果,所以我尝试执行以下操作:
// 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;
});
}
Run Code Online (Sandbox Code Playgroud)
现在获取下一个令牌的方式并不重要
关键是我试图在递归模式下进行异步调用,但是它不起作用,这样我就遇到了无限循环。
我用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);
});
Run Code Online (Sandbox Code Playgroud)
请注意,您需要为此使用Node.js 7.9.0+:http ://node.green/
对于旧版本,请安装以下版本:https : //github.com/yortus/asyncawait
您也可以使用递归函数,但是平滑/现代的方式是异步/等待。
| 归档时间: |
|
| 查看次数: |
946 次 |
| 最近记录: |