【问题标题】:why is .forEach() acting asynchronously? - node.js [duplicate]为什么 .forEach() 异步执行? - node.js [重复]
【发布时间】:2023-04-04 05:07:01
【问题描述】:

我正在尝试使用 request 从网页获取一些信息以获取页面,然后使用 cheerio 将 DOM 遍历到我需要的特定部分我正在对数组中的多个元素重复此过程使用array.forEach 使用此代码:

const cheerio = require('cheerio');
const request = require('request');
var i = 0;
var rates = [];
['AUD', 'CAD'].forEach(function(currancy){
  var url = "https://www.google.com/finance/converter?a=1&from=USD&to=" + currancy
  request(url , function(error, res , body){
    const $ = cheerio.load(body);
    var temp = $('.bld');
    var rate = temp.text();
    console.log(rate);
    rates[i]= rate;
    i++;
  })
});
console.log('done');

我期待的结果是这样的:

1.31 AUD
1.28 CAD
done

但我正在安装:

done
1.31 AUD
1.28 CAD

你能告诉我为什么array.forEach 没有阻止我的代码吗?

【问题讨论】:

  • 正在阻塞代码,但是异步请求是非阻塞...它forEachs 在数组上并且对于每个元素,发送一个异步请求。在请求完成之前执行最后一个日志。
  • @AndrewLi 将其作为未来参考的答案
  • 这种一般类型的问题(对 nodejs 中异步调用如何工作的误解)在这里每天被问多次。这里有数百个相关的问题/答案。
  • 这个展示了如何判断多个异步调用何时完成(这就是这里真正发生的事情):Tracking when multiple async calls are done

标签: javascript arrays node.js foreach cheerio


【解决方案1】:

在您向 Google 返回的任何 http 请求之前,您正在打印“完成”。

您遍历货币,为每种货币调用谷歌,然后打印“完成”。然后调用开始返回(以随机顺序,顺便说一句)并打印结果。

所以,forEach 不是异步的,但 http 请求是异步的。

【讨论】:

    猜你喜欢
    • 2017-10-22
    • 2014-04-05
    • 2013-07-10
    • 2018-10-23
    • 2021-05-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多