javascript - while 循环中的异步方法与 Graph API 分页

标签 javascript node.js asynchronous facebook-javascript-sdk facebook-node-sdk

我正在使用 facebook node sdk让 node.js 从 facebook 用户那里获取信息,例如他们的 feed 和 friend ,这工作正常。

但是我遇到了返回数据被分页的问题——我需要在递归模式下构建一些东西。让我解释一下:

FB.api('/me/feed?limit=5000', {
    access_token: token
}, function(response) {
  // response is an object that could have as response.paging.next attribute
}); 

Limit 在这里不起作用,因为它最多返回 245,并返回指示下一页结果的 paging 对象。

因为下一次调用取决于上一次异步调用的结果,所以我尝试这样做:

// 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;
    });
} 

下一个 token 的获取方式暂时不重要

关键是我正在尝试在递归模式下进行异步调用,但它不起作用,这样我就会陷入无限循环。

最佳答案

我用 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

您也可以使用递归函数,但流畅/现代的方式是异步/等待。

关于javascript - while 循环中的异步方法与 Graph API 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43564239/

相关文章:

node.js - MEAN 堆栈中缺少哈希前缀错误

asynchronous - 将数据对象与 Polymer 元素中的属性绑定(bind)

javascript - Node Express 服务器请求。on ('end' )仅针对 get 触发

javascript - 在后台重新加载页面而不通知用户

javascript - 表单未提交 php 和 jquery

javascript - 正则表达式匹配十六进制颜色语法(和缩短形式)

javascript - 在同一进程中创建 "fresh and empty"Node.js JavaScript 上下文的最佳方法?

node.js - 我应该在生产中使用 Nginx 来服务 React 吗?

c# - 在一个循环中,每个异步调用是否使用任务的 continuewith 链接到返回的任务?

java - GWT AsyncCallback 不填充静态成员