-
Javascript是单线程的
JS引擎中负责解释和执行JavaScript代码的线程只有一个,主线程
处理AJAX请求的线程、处理DOM事件的线程、定时器线程、读写文件的线程(Node.js)称为工作线程 -
同步与异步
函数A(arg…),函数返回的时候,调用者就能够拿到预期结果,即拿到了预期的返回值或者看到了预期的效果,这个函数就是同步的
函数A返回的时候,还得不到预期结果,而是需要在将来通过一定的手段得到,那么这个函数就是异步的。fs.readFile('foo.txt', 'utf8', function(err, data) { console.log(data); });
Fs.readFile函数返回时,期望的结果并不会出现,要等到文件全部读取完成之后。
异步函数调用完毕之后,还有工作线程执行异步任务、通知主线程、主线程调用回调函数等多个步骤,这个过程叫做异步过程。 -
异步过程通常是:
主线程发起一个异步请求,相应的工作线程接收请求并告知主线程已收到(异步函数返回);主线程可以继续执行后面的代码,同时工作线程执行异步任务;工作线程完成工作后,通知主线程;主线程收到通知后,执行一定的动作(调用回调函数)。
异步函数的形式:A(args..., callbackFn)
- 发起函数(或叫注册函数)A
- 回调函数callbackFn
- 例如:setTimeout(fn, 1000) fn回调函数
-
消息队列和事件循环
消息队列中消息具体是什么?消息就是注册异步任务时添加的回调函数。 image.png
异步过程中,工作线程在异步完成后需要通知主线程,通知机制就是利用消息队列和事件循环。
工作线程将消息放到消息队列,主线程通过事件循环过程去取消息。
主线程只会做一件事情:从消息队列中取消息、执行消息、再取消息、再执行/消息队列为空就等在消息队列变成非空。并且只有当前消息执行完成后,主进程才会取下一个消息。这个机制就是事件循环机制。取一次消息并执行的过程就叫一次循环。
-
异步与事件
消息队列中每条消息实际上都对应着一个事件。
例如按钮点击函数button.addEventListener("click", function(e){...})就是异步过程的发起函数,事件监听函数function就是异步过程的回调函数。事件触发时,表示异步任务完成,会将事件监听器函数封装成一条消息放到消息队列中,等待主线程执行。 -
同步保证了顺序一致,但容易导致阻塞;异步可以解决阻塞问题,但是会改变顺序性。改变顺序性其实也没什么大不了的,只不过让程序变得稍微难理解了一些。
网友评论