Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的异步与同步代码_Javascript_Node.js - Fatal编程技术网

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

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

  • JavaScript是单线程的,用于处理它使用的异步代码 回调函数,回调函数是被调用的函数 当一项行动完成时。我们如何知道该行动何时完成 已完成。动作侦听器是单独的进程还是介入 JavaScript引擎
  • 如果我们的节点JS服务器得到10个并发请求 下载一个文件,我们使用异步代码来处理每个文件 下载请求,在这种情况下,我们将有10个回调函数 这将在下载完成时触发 每个客户端的下载将在 在客户端完成之前下载,或为所有10个客户端下载 客户端在收到请求后立即启动

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

  • 了解Javascript异步代码执行的执行情况足以让Node JS异步代码执行也能正常运行吗

  • 谢谢。

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

    长回答简短,JavaScript不是完全单线程的。在执行时,内部线程被创建来处理异步功能,比如“代码> XMLHtRPROQuest。 现在来谈谈你的疑问

  • 是,如果请求是异步的,就像I/O操作一样,它会根据JavaScript引擎为其创建单独的线程并在后台执行,而主进程仍在运行,一旦
    调用堆栈
    为空,则
    事件循环
    将推送
    回调队列
    中可用的任务(让您的回调函数在操作完成时被调用)调用堆栈并运行它

  • 这同样取决于执行程序的引擎。Node.js使用
    V8引擎
    ,它可以访问
    libuv
    提供的
    线程池
    ,创建有限数量的线程,并为每个线程分配任务。例如,10个下载文件的请求可以通过首先创建第4个线程来处理读取前4个请求的下载文件,下载后再次下载其他4个,最后下载其余2个文件。回调函数按相同顺序调用

  • setInterval
    setTimeout
    xmlhttprequest
    是额外提供的功能,不是本机JavaScript的一部分。因此,每当调用此类函数时,外部包都会在主JavaScript程序继续运行的情况下对其进行处理,当异步函数完成时,只需c使用结果数据调用回调函数。正如您熟悉的事件循环一样,它是处理从回调队列调用回调函数的循环

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


  • < NodeJs >是单线程的,但是它由C++ +代码> ApIs/code >支持,它确实为引擎代码下的线程提供了线程。这取决于你如何编写代码。这家伙解释它是单线程的。每个客户端的下载将在客户端完成下载之后开始,或者在10个客户端完成。客户端它在收到请求后立即启动-单个线程仅影响阻塞操作发生时代码的执行方式(例如长
    for
    循环)。