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

标签 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.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
*/

最佳答案

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

for(i=0; i < 3; i++){
    console.log(i)
    ^^^^^^^^^^^^^  <--------------------------------

但是这里添加了回调

request(url, function(error,response,body){
             ^^^^^^^^^^^^ <----------------------------

执行 3 次并记录 3, 3, 3:

    if(error){
        throw err;
    } $ = cheerio.load(body)
        var x = $.html()
        console.log(i)
        ^^^^^^^^^^^^^ <-----------------------------
    })

参见 this question理解为什么 i 在回调中被输出为 3 三次,而不是你可能期望的 0, 1, 2 。如果您使用 let 而不是 var,您将得到预期的 0, 1, 2:

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

关于javascript - For 循环 - 条件中断 - 内部异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43445851/

相关文章:

javascript - 在 JavaScript 中单调增加时间?

javascript - d3.js 标记自动定向不起作用

javascript - 在 Javascript 循环中创建嵌套数组

r - 如何在矩阵中按行将 0 分配给最小值(以快速/有效的方式)?

multithreading - for循环中的异步请求返回

javascript - 如何获取 jQuery 对象数组中选项的 value()

r - 应用函数来组合列

javascript - 等待函数未并行发生

javascript - 如何使用 jQuery 对异步操作进行排序?

javascript - 如何以缓存方式迭代 Cold Observable