从其他内部访问函数级别变量

时间:2015-03-26 11:03:15

标签: 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}, 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中更新这些变量?

2 个答案:

答案 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检查条件时,两者仍然等于初始零。

相关问题