ajax是多线程吗

2022-01-19 15:25:15 IT技术网 互联网
浏览

ajax不是多线程,而是单线程的,因为JavaScript是单线程的,而Ajax属于JavaScript范畴,因此Ajax是单线程的。之所以可以利用Ajax做到多线程,这取决于Web服务器,服务端使用多线程处理请求。

本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。

Ajax是单线程还是多线程?

首先明确一点:Ajax是单线程的,因为JavaScript是单线程的,Ajax属于JavaScript范畴,因此Ajax是单线程的。之所以我们可以利用Ajax做到多线程,这取决于Web服务器,服务端使用多线程处理请求。

然后再明确一点:浏览器是多进程的。如图,google浏览器每打开一个tab标签页就会有一个子进程。

因为JS运行在浏览器中,是单线程的,每个window一个JS线程,既然是单线程的,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码。

Ajax异步?

Ajax请求确实是异步的,js引擎执行异步代码而不用等待,是因有为有 消息队列事件循环,这请求是由浏览器新开一个线程请求。浏览器中很多行为是异步的,当一个异步事件发生的时候,它就进入事件队列,浏览器有一个内部大消息循环,Event Loop(事件循环),会轮询大的事件队列并处理事件,只有前面的处理完毕了,空闲了才会执行这个事件,而JavaScript引擎始终是单线程运行回调函数。

结论:

Ajax请求确实是异步的,这请求是由浏览器新开一个线程请求,事件回调的时候是放入Event loop单线程事件队列等候处理。

消息队列中放着我们注册异步任务时添加的回调函数,主线程在发起AJAX请求后,会继续执行其他代码。AJAX线程负责请求url,拿到响应后,它会把响应封装成一个JavaScript对象,然后构造一条消息:

// ajax请求
$.ajax(url, function(resp) {
    console.log('我是响应:', resp);
});
 
 
// 消息队列中的消息就长这个样子
var message = function () {
    callbackFn(response);
}
// 其中的callbackFn就是前面代码中得到成功响应时的回调函数。

主线程在执行完当前循环中的所有代码后,就会到消息队列取出这条消息并执行它,到此为止,就完成了工作线程对主线程的通知,回调函数也就得到了执行。如果一开始主线程就没有提供回调函数,AJAX线程在收到HTTP响应后,也就没必要通知主线程,从而也没必要往消息队列放消息。其中,异步过程的回调函数,一定不在当前这一轮事件循环中执行。

【相关教程推荐:AJAX视频教程】

以上就是ajax是多线程吗的详细内容,更多请关注dnjidi.com其它相关文章!