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是多线程吗的详细内容。更多信息请关注PHP中文网其他相关文章!