gpt4 book ai didi

node.js - 了解回调

转载 作者:太空宇宙 更新时间:2023-11-04 03:30:19 25 4
gpt4 key购买 nike

我创建了一个小脚本来更好地理解回调。

从下面的脚本中,我期望的行为是:“http.get 运行并平均需要 200 毫秒。for 循环“i”增量平均需要 2500 毫秒。在 200 毫秒时,进程应该退出并且脚本应该停止工作。为什么它打印所有 i?如果我更好地理解这一点,我想我理解了回调。

var http = require("http");
var starttime = new Date();

//Function with Callback
for (var j =0; j<10; j++){
http.get({host : 'nba.com'}, function(res){
console.log("Time Taken = ", new Date() - starttime, 'ms');

process.exit();
}).on('error', function(er){
console.log('Got Error :', er.message);
})
}

//Loop that exceeds callback trigger time
for(var i=1; i<10000; i++){
console.log(i);
}

console.log("Time Taken = ", new Date() - starttime, 'ms');

最佳答案

node.js 中的 JavaScript 是单线程的,I/O 是使用事件队列进行事件驱动的。因此,在您的原始 Javascript 线程完成并将控制权返回给系统之前,表示 http 请求完成的异步回调无法运行,然后系统可以从事件队列中提取下一个事件来为 http 请求的完成提供服务。

因此,您的 for 循环将在处理任何 http 响应之前运行完成。

以下是分步过程:

  1. 您的第一个 for 循环运行并发送 10 个 http 请求。
  2. 这些 http 请求使用异步网络在后台运行。当其中一个完成并有响应时,http 模块会将一个事件放入 Javascript 事件队列中,JS 解释器的工作就是在完成其他事件时从事件队列中提取该事件​​。
  3. 第二个 for 循环运行完成,所有 i 值都会输出到控制台。
  4. 您的脚本完成。
  5. 然后,JS 解释器检查事件队列以查看是否有任何待处理的事件。在这种情况下,将会有一些http响应事件。 JS 解释器从事件队列中提取最旧的事件并调用与之关联的回调。
  6. 回调完成后,将从事件队列中提取下一个事件,并且该过程将继续,直到事件队列为空。
  7. 如果您的任何回调调用 process.exit(),则该回调会短路剩余的回调并立即退出进程。

虽然这个其他答案是为浏览器编写的,但事件驱动的单线程概念与 Node.js 中的相同,因此这个其他答案可能会为您解释更多事情:How does JavaScript handle AJAX responses in the background?

关于node.js - 了解回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38966259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com