Javascript 从内部的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

使用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);
}

当我运行这段代码时,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的作用域上遇到了问题,所以假设是这样,然后完全忘记了异步。。。哦!