手机版

用Javascript进行异步编程的过程

时间:2021-08-31 来源:互联网 编辑:宝哥软件园 浏览:

相信很多人对Javascript单线程有疑问:为什么单线程可以实现异步操作?实际上,Javascript确实是单线程的(我们不妨称这个线程为主线程),但是它实现异步操作的方式确实依赖于浏览器中其他线程的帮助。那么其他线程如何帮助Javascript主线程实现异步呢?答案是任务队列和事件循环。

任务排队

首先,作为单线程语言,Javascript中定义的任务在主线程中执行。但不是每个任务都会立即执行,这种不立即执行的任务称为异步任务。相反,那些立即执行的任务称为同步任务。这些异步任务会交给浏览器的其他线程执行,但主线程需要知道这些异步任务的执行状态,以便于下一步操作。

比如主线程准备好做饭了,就发送一个异步任务去买菜。异步任务买菜后,还得告诉主线程:“买菜我买完了”,这样主线程此时就可以开始做饭了。

而且我们知道由于Javascript是单线程的,上面提到的“下一步操作”不能直接在主函数中定义(否则会直接作为同步任务执行),那么这些应该在哪里定义呢?答案在异步任务的回调函数中。在Javascript异步机制中,任务队列是用来维护异步任务回调函数的队列。这样的队列用于存储这些回调函数,在主线程执行完所有同步函数后,将会以先进先出的方式逐一执行。执行任务队列后呢?Javascript主线程执行完了吗?当然不是。否则网页加载后,后续与用户的交互事件(如点击事件)由谁来处理?

事件循环

通过上图我们更形象地了解了Javascript的异步机制。

执行同步任务-检查任务队列中是否有任务-[如果是,执行]-检查任务队列中是否有任务-[如果是,执行]-.可以看到,主线程在执行同步任务后,会无限期地检查任务队列中是否有新的“任务”。这些任务包括异步任务中定义的回调函数和用户交互事件的回调函数。通过事件循环,Javascript不仅很好地处理了异步任务,而且很好地处理了与用户的交互事件。由于任务队列中的任务都是在完成异步任务的回调函数后由事件生成的,所以我们也称上面提到的循环过程为事件循环。

异步机制实践

Console.log('买菜的计时器')Settimeout(function(){ console . log('菜吃完了,主线程去做饭')},0)console.log('你先去买菜,我先看个世界杯')以上代码在浏览器中执行,可能更好理解Javascript的异步机制。

摘要

总而言之,在一个Javascript单线程的背后,浏览器的其他线程为其完成异步服务。为了与主线程通信,这些异步任务等待通过将回调函数推入任务队列来执行。主线程做的是在执行同步任务后,通过事件循环不断检查并执行任务队列中的回调函数。

版权声明:用Javascript进行异步编程的过程是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。