首先明确一点: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是单线程还是多线程