打破Node.js / Express.Js中的无限循环

时间:2017-06-07 22:51:37

标签: javascript node.js express

我已经创建了一个Express应用程序,它应该通过外部API调用进行分页。我已经看过每一个方向,我无法弄清楚为什么函数没有绊倒条件来打破循环。任何帮助,将不胜感激!

看起来我无法从最后一个循环中断,调用makeRequest函数。无限循环的证据是请求回调中的第一个console.log,“我正在发出请求。”我在回调函数中有更多的console.logs,它们也应该总是返回一些东西,但它似乎甚至没有得到那些。

app.post("/api/example", function(req, res) {
    var username = username;
    var password = password;
    var container = [];
    var counter = 0;
    var keepGoing = true;

    var makeRequest = function() {
        console.log("I'm making a request");
        var URL = "https://fakeapiurl.com/&page=" + counter; 
        request.get(URL, { 
            'auth': {
                'user': username, 
                'pass': password,
                'sendImmediately': true
            },
            'content-type': 'application/json'
            }, function(error, response, data) {
                var results = JSON.parse(data);
                var examples = results.examples;
                var numOfExamples = results.numResults;
                console.log(numOfExamples);

                if ((numOfExamples === 0) || (numOfExamples === jobsContainer.length - 1)) {
                    counter = 5;
                    keepGoing = false;
                } else {
                    counter++;
                    for (var i = 0; i < examples.length; i++) {
                    container.push(examples[i]);
                    }
                } 

                if (counter === 5) { 
                    keepGoing = false;
                    container.sort(function(a, b) {
                        etc.
                    });

                    res.send(container); 
                }
            });// end of request call 
        };// end of makeRequest function

    while (keepGoing === true) {
        makeRequest();
    }

});// end of app post

1 个答案:

答案 0 :(得分:1)

这将永远不会像你期望的那样工作,你在同步while循环中触发异步请求。因此,在第一个请求尝试获取数据时,您再次触发相同的请求,因此您的第一个请求将被取消。这就像永远。您应该在前一个请求的成功回调中触发下一个请求,因此在前一个请求解析后会被触发。

类似的东西:

app.post("/api/example", function(req, res) {
var username = username;
var password = password;
var container = [];
var maxPages = 5;
var makeRequest = function(page) {
    console.log("I'm making a request");
    var URL = "https://fakeapiurl.com/&page=" + page; 
    request.get(URL, { 
        'auth': {
            'user': username, 
            'pass': password,
            'sendImmediately': true
        },
        'content-type': 'application/json'
        }, function(error, response, data) {
            var results = JSON.parse(data);
            var examples = results.examples || [];
            var numOfExamples = results.numResults;
            var lastPageReached = (numOfExamples === 0 || numOfExamples === jobsContainer.length - 1);
            lastPageReached = lastPageReached  && page < maxPages;

            if (lastPageReached) {
                container.sort(function(a, b) {
                    etc.
                });
                res.send(container); 
            } else {
                container = container.concat(...examples);
                makeRequest(page + 1);
            } 
        });
    };
  makeRequest(0);
});