【问题标题】:Asynchronous Vs Synchronous Code In JavaScriptJavaScript 中的异步与同步代码
【发布时间】:2018-12-06 03:50:30
【问题描述】:

我一直在尝试深入了解异步与同步代码在 JavaScript 中的工作原理。读了几篇文章。了解调用堆栈、事件循环和函数队列的概念,以及这三者在异步代码和同步代码的情况下如何以不同的方式发挥作用。(https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoophttps://medium.com/@siddharthac6/javascript-execution-of-synchronous-and-asynchronous-codes-40f3a199e687)。 但它仍然没有消除我所有的疑虑。

  1. JavaScript 是单线程的,用于处理它使用的异步代码 回调函数,回调函数是被调用的函数 当一个动作完成时。我们如何知道那个动作是什么时候发生的 完全的。动作监听器是一个单独的进程还是介入 JavaScript 引擎?
  2. 如果我们的 Node JS 服务器获得 10 个并发请求 下载一个文件,我们使用异步代码来处理每个 下载请求,在这种情况下,我们将有 10 个回调函数 这将在下载完成时触发。单身 线程将每个客户端的下载将在之后开始 在完成之前为客户端下载或为所有 10 客户端收到请求后立即启动。

  3. 我读过的所有关于异步代码处理的文章 JavaScript 总是选择 setInterval() 的例子来区分异步和同步代码。我对 xmlhttprequest 如何异步工作更感兴趣。

    1. 了解 Javascript 的异步代码执行对于 Node JS 的异步代码执行也足够了吗?

谢谢。

【问题讨论】:

  • 是的,NodeJs 是单线程的,但它由 C++ APIs 支持,它确实为您的代码在后台创建线程。一切都取决于您如何编写代码
  • youtube.com/watch?v=zphcsoSJMvM这家伙解释得真好
  • 作为单线程,每个客户端的下载将在其前面的客户端的下载完成后开始,或者对于所有 10 个客户端,它会在收到请求后立即开始 i> - 单线程只影响发生阻塞操作时代码的执行方式(例如长for循环)。

标签: javascript node.js


【解决方案1】:

简短的回答,JavaScript 不是完全单线程的。在执行时,会创建内部线程来处理 xmlhttprequest 等异步功能。

现在来回答你的疑问,

    1234563 987654324@ 将Callback Queue 中可用的任务(在操作完成时调用您的回调函数)推送到调用堆栈并运行它。
  1. 同样,这取决于执行程序的引擎。 Node.js 使用V8 Engine,它可以访问libuv 提供的Thread pool,这会创建有限的编号。线程并将任务分配给每个线程。例如,10 个下载文件的请求可能通过首先为前 4 个请求创建 4 个下载文件的线程来处理,然后再次下载其他 4 个文件,最后下载其余 2 个文件。回调函数以相同的顺序被调用。

  2. setIntervalsetTimeoutxmlhttprequest 是额外提供的功能,不是原生 JavaScript 的一部分。因此,每当调用此类函数时,外部包都会对其进行处理,而主 JavaScript 程序仍在继续运行,当异步函数完成时,它只需使用结果数据调用回调函数。正如您所熟悉的事件循环,它是处理从回调队列调用回调函数的一个。

  3. 正如我所说,每个浏览器都有不同的 JavaScript 引擎,并且有不同的处理方式。 NodeJS 使用 Google 的 V8 引擎并有一个名为 libuv 的包来处理异步内容。我建议您参考以下链接:

Overview of Blocking vs Non-Blocking in NodeJS

【讨论】:

    【解决方案2】:

    请注意,你不能编写一个不依赖于内置东西的异步函数——例如,你不能在 JS 中自己重新实现 setTimeout。真正执行异步工作的函数(xmlhttprequestreadFileexec)都是环境(节点/浏览器)的一部分,并调用其他代码,通常是 C++,可以是多线程的。

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多