尝试在Node中运行同步REST请求

时间:2015-07-02 17:04:25

标签: javascript node.js asynchronous express

首先,我没有异步编程的经验,所以如果我错过了一些明显的东西,我很抱歉。

我看到这个问题突然出现了。我知道人们不喜欢在Javascript中强制同步,但在这种情况下是必要的。我正在对生产数据库进行大量调用,因为生成数据库的使用频率太高而无法承担过多的负担。因此,我在循环中设置我的代码以发出请求,等待确认它已完成,睡眠2秒,然后发出下一个请求。这是因为我将在大约10-20分钟的时间内每周从该服务器中提取大量数据。

这是我的代码。 Sleep是一个强制程序使用Date类等待的函数。

    var thread = function(cb){
        cb();

    };


    do{

        var x = thread(function(){
            request.post(options, function(e, r, body){
                console.log(e);
                console.log(r.statusCode);
                issues.push(body["issues"]);
                maxResults = body["total"];
                options.body.startAt += 25;
                console.log("Going to sleep");

            });
            sleep(2000);
        });
        console.log("Waking up and moving to the next cycle");

    }while(issues.length < maxResults);
    console.log("Finished with the requests");
}

虽然我设置了回调,但我的代码仍然是异步运行请求。因为我将maxResults保留为null,很明显我的回调不起作用。这是我的输出:

Waking up and moving to the next cycle
Finished with the requests
Going to sleep

1 个答案:

答案 0 :(得分:1)

您需要创建一个递归异步函数。

它看起来像这样:

function fetch(existingIssues) {
    return sendRequest().then(function() { 
        existingIssues.push(...);
        if (existingIssues.length >= maxResults)
            return existingIssues;
        else
            return fetch(existingIssues);
    });
}
fetch([]).then(...);