Javascript 从内部的else访问函数级别变量,而
使用node.js,我试图从do while循环中的else语句中访问我在函数开头声明的变量:Javascript 从内部的else访问函数级别变量,而,javascript,node.js,Javascript,Node.js,使用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}, funct
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);
}
当我运行这段代码时,count、total和running total被正确注销,但是函数级别count、total和running total变量未定义,因此while只运行一次。这是为什么?我如何从else中更新这些变量?循环中的
请求回调是异步的,因此直到循环完成后,您才会看到请求的结果。您需要重新组织代码以处理异步,大致如下:
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
将在请求的任何回调发生之前返回。您不明白自己在做什么。
您的请求是异步的。
所以你不能只是用时间来包装它
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
迭代不会在请求完成时等待。
所以,当而检查条件时,两者仍然等于初始值0。我真的希望您能详细介绍一下这个高度解释性的注释@vp_arth。目前,它的帮助不大!!异步代码需要不同的思维。我在下面写下答案。啊哈,我并没有复制它,老实说:)谢谢,我最近在js的作用域上遇到了问题,所以假设是这样,然后完全忘记了异步。。。哦!