【问题标题】:Understanding Call backs了解回调
【发布时间】:2016-12-22 07:38:49
【问题描述】:

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

从下面的脚本中,我预期的行为是:“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');

【问题讨论】:

  • for循环是同步的,里面的代码是异步的。它通过触发 get async get 调用的 for 循环运行。 for 循环在 on 回调被触发之前退出。互联网上有大量文档和示例来说明异步的工作原理。
  • 谢谢布赖恩马克。我会检查他们。现在清如云。

标签: node.js callback asynccallback


【解决方案1】:

node.js 中的 Javascript 是单线程的,I/O 是使用事件队列进行事件驱动的。因此,表示 http 请求完成的异步回调无法运行,直到您的原始 Javascript 线程完成并将控制权返回给系统,然后它可以从事件队列中提取下一个事件以服务于 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?

【讨论】:

  • 感谢 Jfiend00。这清楚地解释了它。我忘记的网络或 I/O 是异步的,而 CPU 由于单线程而同步。 For 循环是 CPU 相关的,没有 I/O。有道理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 2014-06-24
  • 2014-12-21
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
相关资源
最近更新 更多