从其他内部访问函数级别variables

使用node.js,我试图访问一个variables,我在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); } 

当我运行这个代码时,计数,总计和运行总数被正确注销,但是function级计数,总计和运行总variables是未定义的,所以while只运行一次。 为什么是这样的,我怎样才能更新从其他内部的这些variables?

       

网上收集的解决方案 "从其他内部访问函数级别variables"

循环内部的requestcallback是asynchronous的 ,所以在循环完成之后,你才会看到请求的结果。 您需要重新组织代码以处理asynchronous,按照以下内容进行操作:

 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发生任何callback之前返回。

你不明白你在做什么。
您的request是asynchronous的。
所以你不能一下子把它包起来。

 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迭代不等待请求完成。
所以,当检查条件时,两者仍然等于初始零。