Aimee

personal blog

欢迎来到我的个人站~


event loop

浏览器的事件循环机制?

  • event loop
  • 宏任务:
    • 代码块、setTimeout、 setInterval I/O操作
  • 微任务
    • new Promise().then()

为什么要引入微任务,只有宏任务可以吗?

  • 宏任务,先进先出的原则执行,对于高优先级的任务就无法处理了

node 中的事件循环和浏览器中的事件循环有什么区别?

  • 宏任务的执行顺序:
    • timers定时器,执行已经安排的setTimeout和setinterval的回调函数
    • pending callback 待定回调:执行延迟到下一个循环迭代的I/O循环
    • idle, prepare:进系统内部使用
    • poll:检索新的I/O事件,执行与I/O相关的回调
    • check: 执行setImmediate() 回调函数
    • close callback: 关闭socket回调函数执行

微任务和宏任务在node执行顺序

与node版本有关

node v10 及以前:

  • 1.执行完一个阶段中的所有任务
  • 2.执行nextTick队列里的内容
  • 3.执行完微任务队列的内容

node v10以后版本,根浏览器执行顺序一致

事件的捕获和冒泡机制是什么?

  • 捕获:是从window到目标元素
  • 冒泡:是从目标元素到window

window.addEvnetListener监听的是什么阶段的事件?

  • 默认是冒泡,取决于最后一个参数。默认是false,代码冒泡,如果是true代表是捕获阶段

平常有哪些场景用到这个机制?

  • 事件委托

了解Promise吗?平时用的多吗?

promise.all 你知道有什么特性吗?

function PromiseAll(promiseArray) {
    return new Promise((resolve, reject) => {
        if(!Array.isArray(promiseArray)) {
            return reject(new Error('传入的值不是一个数组'));
        }

        const len = promiseArray.length;
        const res = [];
        let counter = 0;
        for(let i = 0; i < len; i++) {
            Promise.resolve(promiseArray[i]).then(val => {
                counter++;
                res[i] = val;
                if(counter === len) {
                    reslove(res);
                }
            }).catch(e => reject(e));
        }
    })
}