JavaScript中的异步与同步代码
我一直试图深入了解异步代码与同步代码在JavaScript中的工作原理。读了不少文章。理解了调用堆栈、事件循环和函数队列的概念,以及在异步代码和同步代码的情况下,这三者的作用是如何不同的。(JavaScript中的异步与同步代码,javascript,node.js,Javascript,Node.js,我一直试图深入了解异步代码与同步代码在JavaScript中的工作原理。读了不少文章。理解了调用堆栈、事件循环和函数队列的概念,以及在异步代码和同步代码的情况下,这三者的作用是如何不同的。(https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoophttps://medium.com/@Siddhartac6/javascript-execution-of-synchronous-and-asynchronous-codes
https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
https://medium.com/@Siddhartac6/javascript-execution-of-synchronous-and-asynchronous-codes-40f3a199e687
)。
但这仍然不能消除我所有的疑虑
谢谢。请注意,您无法编写不依赖于内置内容的异步函数-例如,您无法自己在JS中重新实现
setTimeout
。真正执行异步工作的函数(xmlhttprequest
,readFile
,exec
)都是环境的一部分(节点/浏览器),并调用其他代码,通常是C++,可以是多线程的。 长回答简短,JavaScript不是完全单线程的。在执行时,内部线程被创建来处理异步功能,比如“代码> XMLHtRPROQuest。 现在来谈谈你的疑问
调用堆栈
为空,则事件循环
将推送回调队列
中可用的任务(让您的回调函数在操作完成时被调用)调用堆栈并运行它V8引擎
,它可以访问libuv
提供的线程池
,创建有限数量的线程,并为每个线程分配任务。例如,10个下载文件的请求可以通过首先创建第4个线程来处理读取前4个请求的下载文件,下载后再次下载其他4个,最后下载其余2个文件。回调函数按相同顺序调用setInterval
,setTimeout
,xmlhttprequest
是额外提供的功能,不是本机JavaScript的一部分。因此,每当调用此类函数时,外部包都会在主JavaScript程序继续运行的情况下对其进行处理,当异步函数完成时,只需c使用结果数据调用回调函数。正如您熟悉的事件循环一样,它是处理从回调队列调用回调函数的循环libuv
的包来处理异步内容。我建议您参考以下链接:< NodeJs >是单线程的,但是它由C++ +代码> ApIs/code >支持,它确实为引擎代码下的线程提供了线程。这取决于你如何编写代码。这家伙解释它是单线程的。每个客户端的下载将在客户端完成下载之后开始,或者在10个客户端完成。客户端它在收到请求后立即启动-单个线程仅影响阻塞操作发生时代码的执行方式(例如长
for
循环)。