Javascript 如何通过node.js中的API回调异步递归?

Javascript 如何通过node.js中的API回调异步递归?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,API调用返回下一个“页面”的结果。如何优雅地递归该结果回调 下面是一个我需要执行此操作的示例: var url = 'https://graph.facebook.com/me/?fields=posts&since=' + moment(postFromDate).format('YYYY-MM-DD') + '&access_token=' + User.accessToken; request.get({ url: url, json: true }, f

API调用返回下一个“页面”的结果。如何优雅地递归该结果回调

下面是一个我需要执行此操作的示例:

var url = 'https://graph.facebook.com/me/?fields=posts&since=' + moment(postFromDate).format('YYYY-MM-DD') + '&access_token=' + User.accessToken;
request.get({
    url: url,
    json: true
}, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        _.each(body.posts.data, function (post) {
            User.posts.push(post); //push some result
        });
        if (body.pagination.next) { // if set, this is the next URL to query
            //?????????
        }
    } else {
        console.log(error);
        throw error;
    }

});

我建议将调用包装在函数中,并在必要时继续调用它

我还将添加一个回调,以了解进程何时完成

function getFacebookData(url, callback) {

    request.get({
        url: url,
        json: true
    }, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            _.each(body.posts.data, function (post) {
                User.posts.push(post); //push some result
            });
            if (body.pagination.next) { // if set, this is the next URL to query
                getFacebookData(body.pagination.next, callback);
            } else {
                callback(); //Call when we are finished
            }
        } else {
            console.log(error);
            throw error;
        }

    });
}

var url = 'https://graph.facebook.com/me/?fields=posts&since=' + 
    moment(postFromDate).format('YYYY-MM-DD') + '&access_token=' + User.accessToken;

getFacebookData(url, function () {
    console.log('We are done');
});

太好了,谢谢。现在很明显。顺便问一句,在这种情况下,我使用函数getFacebookData()和var getFacebookData=function()有什么原因吗?没有硬性原因,只有软性原因——首先,这至少对我来说是一种更自然的函数定义方式,其次,如果你忘记了“var”,那么它将成为一个全局函数。第三点也是最有用的一点——如果以这种方式声明,函数将有一个名称,而不是匿名的。这有它的用途。其中最简单的是——它将显示在堆栈跟踪中。