1

我正在使用facebook node sdk for node.js 从 facebook 用户那里获取信息,例如他们的提要和朋友,这工作正常。

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

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

限制在这里不起作用,因为它返回最大值 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;
    });
} 

获得下一个令牌的方式目前并不重要

关键是我试图在递归模式下进行异步调用,但它不起作用,这样我就得到了一个无限循环。

4

3 回答 3

6

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

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

于 2017-04-22T20:42:24.277 回答
1

而不是使用:

feedItems.concat(response.data);

我已经做了:(如果 response.data 上的情况有数据)

for(var i in response.data){
   feedItems.push(response.data[i]);
}
于 2018-11-06T01:56:38.833 回答
0

截至今天(21 年 12 月 10 日),response.data 的类型为 Object。下面将适合保存响应数据。

for (let d of response.data) {
  feedItems.push(d)
}

于 2021-12-10T18:21:02.183 回答