2012-12-10 55 views
0

我正在使用名为node-github的NodeJS模块,它是围绕Github API的封装,以获取有关某些用户的某些统计信息,例如他们的追随者:正确的方法从使用链接标头的API获取所有页面(使用JavaScript/NodeJS)

var getFollowers = function(user, callback) { 
    github.user.getFollowers(user, function(err, res) { 
    console.log("getFollowers", res.length); 
    callback(err, res); 
    }); 
}; 

... 

getFollwers({user: mike}, function(err, followers) { 
    if(err) { 
    console.log(err); 
    } 
    else { 
    console.log(followers); 
    } 
}); 

显然,Github上限制通话效果为最大的100(通过per_page参数),并利用the Link header让你知道一个“下一页”结果的存在。

我使用的模块提供了几种简单的方法来处理链接标题,因此您不需要解析它。基本上,你可以打电话github.hasNextPage(res)github.getNextPage(res)(其中res是你从原来的github.user.getFollowers()呼叫收到的响应)

我正在寻找的是正确的方法/范式将我的函数返回所有结果,包括所有页面。我用递归函数尝试了一下,尽管它有效,但我不禁感觉可能会有更好的方法。

这个答案可以作为一个很好的方法来处理所有未来的链接标题调用 - 不只是Github的 - 如果标准着手。

谢谢!

+0

你有没有考虑建立发射追随者定制可读流? – AndyD

+0

@AndyD请你详细说明一下吗? –

回答

0

最后,采取了递归(记住递归的两大缺点:维护它,并解释它:))。这里是我当前的代码,如果有人有兴趣:

var getFollowers = function(callback) { 
    var followers = [] 
    , getFollowers = function(error, result) { 
     followers = followers.concat(result); 
     if(github.hasNextPage(result)) { 
     github.getNextPage(result, getFollowers); 
     } 
     else { 
     callback(error, followers); 
     } 
    };    

    github.user.getFollowers(options, getFollowers); 
}; 

但是,我发现,如果你只需要跟随者的总数,可以使用getLastPage函数来获取最后一页的追随者的数量和然后

total_num_of_followers = num_of_followers_on_last_page +(total_num_of_pages * results_per_page)

相关问题