美文网首页
Javascript 同步,异步 及 Event Loop

Javascript 同步,异步 及 Event Loop

作者: HarlieYang | 来源:发表于2019-02-20 13:18 被阅读0次

在说同步,异步之前,先了解Javascript是单线程的语言,有且只有一个调用栈,一次只能够做一件事情。因此,也决定了javascript的任务都需要进行排队执行。

同步及异步的概念

同步指的是在主线程上面排队执行的任务,前一个任务完成之后,才能执行下一个任务

异步指的是,主线程发现是异步操作,则进入异步模块处理过程(调用相对应的web api)。当满足条件时,将获取的结果推入任务队列进行排队,当"执行栈"中的所有同步任务执行完毕即主线程为空时,任务队列中的事件推入执行栈中进行执行。

异步执行任务的过程如下:

任务队列的理解

"任务队列"可以理解为事件的队列,异步处理完成一项任务,就往任务队列中添加一个事件,事件中包含相对应的回调函数。 例如:定时器(setTimeout),异步处理使用timer模块。当到达相应的时间之后,任务队列添加一个事件,放入相对应的回调函数。 回调函数,就是那些会被主线程挂起来的代码。异步任务必须指定回调函数。主线程执行任务队列中事件,就是执行对应的回调函数。

任务队列是一个先进先出的数据结构,排在前面的事件,优先被主线程执行。执行栈任务清空之后就执行任务队列的第一个事件。

Event Loop

强烈推荐 关于讲解Event Loop的一个视频  Event Loop,翻墙可看有同步翻译。或者 点击这个链接"Event Loop" 不需要翻墙,但是无翻译     

上图中,主线程运行的时候,产生堆(heap)和栈(stack),有异步任务时栈中的代码调用所对应的Web API,它们在"任务队列"中添加相对应的事件。只要栈中的代码执行完毕,主线程就会去读取"任务队列",依次执行那些事件所对应的回调函数。主线程从任务队列中读取事件是循环不断的,整个的运行机制就称为Event Loop(如上图为整个的运行机制)

关于异步的操作

回调函数、Promise、生成器、Async/Await    (之后会说到)

写的不好的地方,欢迎大家指正。

参考:

谷雨 -- JavaScript 异步、栈、事件循环、任务队列

阮一峰 Event-loop

Philip Roberts :What the heck is the event loop anyway?

相关文章

网友评论

      本文标题:Javascript 同步,异步 及 Event Loop

      本文链接:https://www.haomeiwen.com/subject/xczyjftx.html