26 # eventloop 执行顺序

简介: 26 # eventloop 执行顺序

js 执行流程

例子1

// es6 内部是一个微任务
Promise.resolve().then(() => {
    console.log("Promise1");
    setTimeout(() => {
        console.log("setTimeout2");
    }, 0);
});
setTimeout(() => {
    console.log("setTimeout1");
    Promise.resolve().then(() => {
        console.log("Promise2");
    });
}, 0);

例子2

事件点击跟直接触发 addEventListener 是宏任务

button.addEventListener("click", () => {
    console.log("Listener1");
    Promise.resolve().then(() => {
        console.log("Promise1");
    });
});
button.addEventListener("click", () => {
    console.log("Listener2");
    Promise.resolve().then(() => {
        console.log("Promise2");
    });
});

直接点击按钮:会有两个宏任务进入队列,然后一次根据js执行流程去走,输出 Listener1 Promise1 Listener2 Promise2

如果直接执行 button.click(),相当通两个同时执行,会输出 Listener1 Listener2 Promise1 Promise2

例子3

async function async1() {
    console.log("async1 start");
    // 浏览器识别async+await,await 后面跟的是 promise 的话默认就会直接调用这个 promise 的 then 方法
    // async2 会立即执行,相当于async2().then(() => {console.log("async1 end")})
    await async2();
    console.log("async1 end");
}
async function async2() {
    console.log("async2");
}
console.log("script start");
setTimeout(() => {
    console.log("setTimeout");
}, 0);
async1();
new Promise((resolve, reject) => {
    console.log("promise1");
    resolve();
}).then(function () {
    console.log("promise2");
});
console.log("script end");
  • 默认执行: script start、async1 start、async2、promise1、script end
  • 微任务:[async1 end, promise2]
  • 宏任务:[setTimeout]

目录
相关文章
|
8月前
|
安全 API
muduo源码剖析之EventLoop事件循环类
EventLoop.cc就相当于一个reactor,多线程之间的函数调用(用eventfd唤醒),epoll处理,超时队列处理,对channel的处理。运行loop的进程被称为IO线程,EventLoop提供了一些API确保相应函数在IO线程中调用,确保没有用互斥量保护的变量只能在IO线程中使用,也封装了超时队列的基本操作。
91 0
|
3月前
|
存储 运维 API
源码解密协程队列和线程队列的实现原理(一)
源码解密协程队列和线程队列的实现原理(一)
45 1
|
3月前
|
存储 安全 API
源码解密协程队列和线程队列的实现原理(二)
源码解密协程队列和线程队列的实现原理(二)
38 1
|
8月前
|
Web App开发 前端开发 JavaScript
什么是事件循环 Eventloop
什么是事件循环 Eventloop
96 0
|
JavaScript 前端开发 调度
25 # eventloop 执行流程
25 # eventloop 执行流程
60 0
线程执行顺序怎么控制?
线程执行顺序怎么控制?
56 0
|
数据采集 调度 开发者
协程这么好,那它能完全代替线程吗?
协程这么好,那它能完全代替线程吗?
207 0
协程这么好,那它能完全代替线程吗?
|
Java 数据处理 C++
c++11线程池的实现原理及回调函数的使用
c++11线程池的实现原理及回调函数的使用
|
Java 调度
高并发编程-线程通信_使用wait和notify进行线程间的通信
高并发编程-线程通信_使用wait和notify进行线程间的通信
91 0
|
监控 JavaScript 前端开发