Javascript For循环-条件中断-内部异步函数

Javascript For循环-条件中断-内部异步函数,javascript,for-loop,asynchronous,Javascript,For Loop,Asynchronous,有人能给我解释一下这里的for循环发生了什么吗?我不明白为什么循环超出了它的“状态”。我希望条件[I]在“2”处停止。我假设对于for循环中的其他异步函数,这种行为是相同的。非常感谢 var path = require('path') var fs = require('fs') var request = require('request') var cheerio = require('cheerio') for (i=0; i < 3; i++) { console.lo

有人能给我解释一下这里的
for
循环发生了什么吗?我不明白为什么循环超出了它的“状态”。我希望条件
[I]
在“2”处停止。我假设对于
for
循环中的其他异步函数,这种行为是相同的。非常感谢

var path = require('path')
var fs = require('fs')
var request = require('request')
var cheerio = require('cheerio')

for (i=0; i < 3; i++) {
    console.log(i)
    var arr = []
    var url = 'https://en.wikipedia.org/wiki/Web_scraping'

    request (url, function(error,response,body) {
      if(error){
        throw err;
      } $ = cheerio.load(body)

      var x = $.html()
      console.log(i)
    })
}

/* Results
0
1
2
3
3
3
*/
var path=require('path'))
var fs=require('fs')
var request=require('请求')
var cheerio=require('cheerio')
对于(i=0;i<3;i++){
控制台日志(i)
var arr=[]
var url='1〕https://en.wikipedia.org/wiki/Web_scraping'
请求(url、函数(错误、响应、正文){
如果(错误){
犯错误;
}$=cheerio.load(车身)
var x=$.html()
控制台日志(i)
})
}
/*结果
0
1.
2.
3.
3.
3.
*/

您的循环执行3次,并在此处记录
i
-
0,1,2

for(i=0; i < 3; i++){
    console.log(i)
    ^^^^^^^^^^^^^  <--------------------------------
for(let i=0; i < 3; i++){
请参阅以了解为什么在回调中将
i
作为
3
输出三次,而不是您可能期望的
0、1、2
。如果您使用
let
而不是
var
,您将得到预期的
0、1、2

for(let i=0; i < 3; i++){
for(设i=0;i<3;i++){

Maximus告诉您为什么代码会这样做。但是如何修复它呢?最基本的方法是,如果您可以使用ES6语言功能(您可能可以,因为它看起来像是在使用Node.js),用于声明变量,而不是使用
var
let
以您可能期望的方式运行。除了从lambdas引用时行为更合理外,使用
let
声明的变量具有块作用域而不是函数作用域,这更直观。

为(i=0;i<3;i++){如果它从
0开始,它将运行
3次
只运行两次,或者更改
for(i=1;i<3;i++){
或者
for(i=0;i<2;i++){
或者
for(i=0;我感谢Maximus将其分解。实际上,我不希望函数返回“0,1,2”,因为我知道“i”当async返回任何值时,条件已达到其“最大值”。我希望是“2,2,2”。如果它循环执行3次,而不是4次,那么为什么会有“3”?感谢链接。我现在就来看看!@user7861743,不客气。我希望是“2,2,2”,不,循环结束时,
i
计数器将指向
3
。这就是为什么
i<3
条件计算为
false
,循环结束。否则,如果
i
停留在
2
,循环将永远不会结束。顺便说一句,如果有助于感谢Brian的解释,您可以接受我的答案。我使用的是自执行f我试图绕过我所面临的问题,但我尝试了“let”,结果似乎完全一样。
for(let i=0; i < 3; i++){