浏览器的事件循环机制?
- 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));
}
})
}