Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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_Asynchronous - Fatal编程技术网

单线程如何处理JavaScript中的异步代码

单线程如何处理JavaScript中的异步代码,javascript,asynchronous,Javascript,Asynchronous,我知道javascript在单线程上运行。我还知道,当我们使用jquery进行异步ajax调用时,代码不会停止并连续执行。响应由回调处理。我的问题是单线程是如何做到这一点的当我们得到响应时,线程是否处理回调并停止进一步的代码执行?否,它不会停止代码执行 回调将进入队列,当没有其他要执行的操作时,它将运行 没有两件事同时发生,日程安排也不是先发制人的 因此,如果您让单个线程忙于无限循环之类的事情,那么回调将永远不会有机会运行 浏览器管理事件队列。当事件发生时,例如Ajax调用、计时器触发或鼠标或触

我知道javascript在单线程上运行。我还知道,当我们使用jquery进行异步ajax调用时,代码不会停止并连续执行。响应由回调处理。我的问题是单线程是如何做到这一点的当我们得到响应时,线程是否处理回调并停止进一步的代码执行

否,它不会停止代码执行

回调将进入队列,当没有其他要执行的操作时,它将运行

没有两件事同时发生,日程安排也不是先发制人的


因此,如果您让单个线程忙于无限循环之类的事情,那么回调将永远不会有机会运行

浏览器管理事件队列。当事件发生时,例如Ajax调用、计时器触发或鼠标或触摸事件的响应,当主线程空闲时,会在主线程上调用相应的回调。

这不是它的具体工作方式,因为它取决于您使用的是节点还是浏览器以及哪个浏览器,但这是一个良好的心智模型

JavaScript是另一种语言,比如C,它是多线程的。当JavaScript运行ajaxs请求时,它会将请求添加到队列中,而为处理网络请求而构建的语言也会这样做。当请求完成时,它会更改队列中的值。
在每个进程周期之后,JavaScript将检查此队列并运行链接到已完成任务的任何回调。所以JavaScript本身不做这个过程,只是在完成后进行检查。

你说的“无事可做”到底是什么意思??什么时候才有机会跑呢??你能举例说明吗?:)有一个事件循环(以单线程方式)运行所有需要运行的脚本。所有回调都已排队,并将逐个运行。如果将无限循环放入其中一个函数中,该函数将永远不会完成,并且控制不会返回到事件循环。结果,队列不再被处理,系统挂起。对此有一个很好的答案,其中包含了大量的参考文献。