使用node.js,我试图从do while循环中的else语句中访问我在函数开头声明的变量:
function myFunction(){
var limit = 2000;
var count;
var total;
var runningTotal = 0;
var url = 'http://example.com';
var self = this;
do{
request({'url': url}, function (error, response, body) {
if(error)logger.error(error);
else{
count = JSON.parse(body).count;
console.log('count = ' + count);
total = JSON.parse(body).total;
console.log('total = ' + total);
runningTotal+=count;
console.log('running total = ' + runningTotal);
var parsedBody = JSON.parse(body);
self.parseResults(parsedBody.rows);
}
});
} while(total > runningTotal);
}
当我运行此代码时,计数,总计和运行总计被正确记录,但功能级别计数,总计和运行总变量未定义,因此while只运行一次。这是为什么,以及如何从else中更新这些变量?
答案 0 :(得分:3)
循环中的request
回调是异步,所以在循环完成之后,您才能看到请求的结果。您需要重新组织代码以处理异步,这些内容如下:
function myFunction(){
var limit = 2000;
var count;
var total;
var runningTotal = 0;
var url = 'http://example.com';
var self = this;
doRequest();
function doRequest() {
request({'url': url}, function (error, response, body) {
if(error)logger.error(error);
else{
count = JSON.parse(body).count;
console.log('count = ' + count);
total = JSON.parse(body).total;
console.log('total = ' + total);
runningTotal+=count;
console.log('running total = ' + runningTotal);
var parsedBody = JSON.parse(body);
self.parseResults(parsedBody.rows);
if (total > runningTotal) {
doRequest();
}
}
});
}
}
另请注意,myFunction
会在request
的任何回调发生之前返回。
答案 1 :(得分:0)
你不明白你在做什么
您的request
是异步的。
所以你不能只用它包裹它。
function myFunction(){
var limit = 2000;
var count;
var total;
var runningTotal = 0;
var url = 'http://example.com';
var self = this;
function doRequest() {
request({'url': url}, function (error, response, body) {
if(error)logger.error(error);
else{
count = JSON.parse(body).count;
console.log('count = ' + count);
total = JSON.parse(body).total;
console.log('total = ' + total);
runningTotal+=count;
console.log('running total = ' + runningTotal);
var parsedBody = JSON.parse(body);
self.parseResults(parsedBody.rows);
}
// repeat if need here
if (total > runningTotal) doRequest();
});
}
doRequest();
}
关于您的代码。
请求完成后,while
次迭代不会等待
因此,当while
检查条件时,两者仍然等于初始零。