我已经创建了一个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
答案 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);
});