如果 javascript 是单线程的,那么如何管理 ajax 调用?

sac*_*oni 4 javascript

我了解到,JavaScript 始终是单线程的。如果您在页面上执行 JavaScript 代码块,则当前不会执行该页面上的其他 JavaScript。如果是这种情况那么Javascript如何管理Ajax调用?如果单个线程正忙并且当前正在该页面上执行其他 Javascript,那么当从 ajax 调用返回(成功或其他)时线程如何管理?Javascript 内部是否使用多个线程来处理调用返回?

Tra*_*mes 5

javascript引擎本身是单线程的,但 javascript 在包含不仅仅是 js 引擎的托管环境中执行。托管环境可以是浏览器、服务器等。

在托管环境中有一个叫做事件循环的东西。此事件循环管理 js 脚本的某些部分何时应该运行。因此,当您编写诸如以下内容时:

setTimeout(() => console.log('tick'), 1000)
Run Code Online (Sandbox Code Playgroud)

回调函数被放在事件循环中(不完全,但足够接近用于解释目的),一旦当前的 js 执行线程为空,事件循环将检查队列中是否有任何东西,如果有,它将把它推到主要的js执行线程。

总而言之,js 引擎本身是单线程的,但在完整的 js 托管环境中还有更多内容可以使其工作。