Skip to content
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

归纳JavaScript事件循环(event loop) #12

Open
ZhenHe17 opened this issue Nov 24, 2018 · 1 comment
Open

归纳JavaScript事件循环(event loop) #12

ZhenHe17 opened this issue Nov 24, 2018 · 1 comment
Labels

Comments

@ZhenHe17
Copy link
Owner

ZhenHe17 commented Nov 24, 2018

规范

  • JavaScript 在运行时是单线程的
  • JavaScript 的并发模型基于"事件循环"
  • JavaScript 函数调用时形成了一个栈模型
  • JavaScript 运行时维护了一个消息队列
  • 消息队列中分为宏任务(macrotasks)和微任务(microtasks),每个宏任务有一个微任务队列。例子:
    • macrotasks: setTimeout, requestAnimationFrame, I/O, UI rendering
    • microtasks: process.nextTick, Promises, Object.observe

事件循环

简单来说,每一轮事件循环将会:
1.以队列的顺序执行先进入队列的宏任务
2.以队列的顺序执行完当前宏任务的所有微任务
3.以队列的顺序执行下一个宏任务

例子

执行以下代码将会输出什么?

var foo = () => (new Promise((resolve, reject) => {
    console.log(1);
    let p = new Promise((resolve, reject) => {
        console.log(2);
        setTimeout(() => {
            console.log(3);
        }, 0)
        resolve(4);
    });
    resolve(5);
    p.then((arg) => {
        console.log(arg);
    });
}));

foo().then((arg) => {
    console.log(arg);
});

console.log(6);

事件循环第一轮:立即输出1,2,6。然后在本轮的微任务队列里输出4,5。

事件循环第二轮:执行宏任务队列中setTimeout的函数体,输出3。

代码执行后依次输出1,2,6,4,5,3

参考文章

Concurrency model and Event Loop-MDN
Difference between microtask and macrotask within an event loop context

@ZhenHe17 ZhenHe17 added the js label Nov 24, 2018
@ZhenHe17 ZhenHe17 changed the title 深入JavaScript事件循环(event loop) 归纳JavaScript事件循环(event loop) Nov 26, 2018
@FLF1995
Copy link

FLF1995 commented Nov 26, 2018

博主写的精炼,刚好最近遇到事件循环的问题,看完觉得总结的不错,哈哈

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants