-
Notifications
You must be signed in to change notification settings - Fork 132
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
浏览器的Tasks、microtasks、 queues 和 schedules #21
Comments
Great! Explain my doubts. |
const p = Promise.resolve();
(async () => {
await p;
console.log('await end');
})();
p.then(() => {
console.log('then 1');
}).then(() => {
console.log('then 2');
}); 为什么我在Ghrome中运行结果是 |
浏览器的Event loop是遵循的HTML5的标准
NodeJs的Event loop遵循的是libuv
|
@sisterAn 答案写错了。 chrome 运行的结果是: |
var a = Promise.resolve(); 输出 await end -> then1 -> then 2 |
2个疑惑: |
node v12.14.0 运行结果是:await end -> then1 -> then2 ,这个应该是新版本修正了,按async-await定义也应该是这个结果 |
一道面试题引发的血案,下面进入主题:
题目的本质,就是考察
setTimeout
、promise
、async await
的实现及执行顺序,以及JS的事件循环的相关问题。答案:
再看一个经典的例子:
答案:
你答对了吗?这里涉及到
Microtasks
、Macrotasks
、event loop 以及 JS 的异步运行机制。一、event loop
JS主线程不断的循环往复的从任务队列中读取任务,执行任务,其中运行机制称为事件循环(event loop)。
二、Microtasks、Macrotasks(task)
在高层次上,JavaScript 中有 microtasks 和 macrotasks(task),它们是异步任务的一种类型,
Microtasks
的优先级要高于macrotasks
,macrotasks 用于处理 I/O 和计时器等事件,每次执行一个。microtask 为async
/await
和 Promise 实现延迟执行,并在每个 task 结束时执行。在每一个事件循环之前,microtask 队列总是被清空(执行)。图1: 微任务和任务之间的区别
下面是它们所包含的api:
注意:
三、异步运行机制
我们已知, JS 是单线程的,至于为什么,详见 JS 基础之异步(一)。
下面看一个例子:
JS 主线程拥有一个 执行栈(同步任务) 和 一个 任务队列(microtasks queue),主线程会依次执行代码,
这就是 JS的异步执行机制
四、async await、Promise、setTimeout
setTimeout
Promise
Promise本身是同步的立即执行函数, 当在 executor 中执行 resolve 或者 reject 的时候, 此时是异步操作, 会先执行 then/catch 等,当主栈完成后,才会去调用 resolve/reject 中存放的方法执行,打印 p 的时候,是打印的返回结果,一个 Promise 实例。
当JS主线程执行到Promise对象时,
回到文章开头经典的例子:
例如:
async await
async 函数返回一个 Promise 对象,当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再执行函数体内后面的语句。可以理解为,是让出了线程,跳出了 async 函数体。
举个例子:
很显然,func1的运行结果其实就是一个 Promise 对象。因此我们也可以使用 then 来处理后续逻辑。
await 的含义为等待,也就是 async 函数需要等待 await 后的函数执行完成并且有了返回结果( Promise 对象)之后,才能继续执行下面的代码。await通过返回一个Promise对象来实现同步的效果。
The text was updated successfully, but these errors were encountered: