带有Graph API分页的while循环中的异步方法

时间:2017-04-22 20:28:00

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

我正在使用facebook node sdk来获取node.js来获取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
}); 

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

获取下一个令牌的方式现在并不重要

关键是我正在尝试以递归模式执行异步调用,但它不起作用,这样我就会得到一个无限循环。

2 个答案:

答案 0 :(得分:5)

我想用async / await来解决这个问题:

$base = $url;
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_URL, $base);
curl_setopt($curl, CURLOPT_REFERER, $base);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$str = curl_exec($curl);
curl_close($curl);

$html = new simple_html_dom();
$html->load($str);

请注意,您需要Node.js 7.9.0+:http://node.green/

对于旧版本,请安装:https://github.com/yortus/asyncawait

您也可以使用递归函数,但平滑/现代的方式是async / await。

答案 1 :(得分:1)

代替使用:

feedItems.concat(response.data);

我已经做出了:(如果在response.data上有数据的话)

for(var i in response.data){
   feedItems.push(response.data[i]);
}