在说同步,异步之前,先了解Javascript是单线程的语言,有且只有一个调用栈,一次只能够做一件事情。因此,也决定了javascript的任务都需要进行排队执行。
同步及异步的概念
同步指的是在主线程上面排队执行的任务,前一个任务完成之后,才能执行下一个任务
异步指的是,主线程发现是异步操作,则进入异步模块处理过程(调用相对应的web api)。当满足条件时,将获取的结果推入任务队列进行排队,当"执行栈"中的所有同步任务执行完毕即主线程为空时,任务队列中的事件推入执行栈中进行执行。
异步执行任务的过程如下:
![](https://img.haomeiwen.com/i12357099/e2a3fab4650b7cba.jpg)
任务队列的理解
"任务队列"可以理解为事件的队列,异步处理完成一项任务,就往任务队列中添加一个事件,事件中包含相对应的回调函数。 例如:定时器(setTimeout),异步处理使用timer模块。当到达相应的时间之后,任务队列添加一个事件,放入相对应的回调函数。 回调函数,就是那些会被主线程挂起来的代码。异步任务必须指定回调函数。主线程执行任务队列中事件,就是执行对应的回调函数。
任务队列是一个先进先出的数据结构,排在前面的事件,优先被主线程执行。执行栈任务清空之后就执行任务队列的第一个事件。
Event Loop
强烈推荐 关于讲解Event Loop的一个视频 Event Loop,翻墙可看有同步翻译。或者 点击这个链接"Event Loop" 不需要翻墙,但是无翻译
上图中,主线程运行的时候,产生堆(heap)和栈(stack),有异步任务时栈中的代码调用所对应的Web API,它们在"任务队列"中添加相对应的事件。只要栈中的代码执行完毕,主线程就会去读取"任务队列",依次执行那些事件所对应的回调函数。主线程从任务队列中读取事件是循环不断的,整个的运行机制就称为Event Loop(如上图为整个的运行机制)
关于异步的操作
回调函数、Promise、生成器、Async/Await (之后会说到)
写的不好的地方,欢迎大家指正。
参考:
网友评论