Promise
- Promise是es6引入的一种标准,更好的处理异步操作和解决回调地狱,具有更好的可读性和可维护性
- Promise有三种状态。Pending(进行中)、Fulfilled(完成)、Reject(失败)
- Fulfilled(完成)、Reject(失败)分别对应then和catch的回调
- 可以使用then进行链式调用,每一个then会返回新的Promise。手写Promise.all如下
-
function myPromiseAll(iterable) { return new Promise((resolve,reject) => { const promises = Array.from(iterable); // 定义Promise对象resolve的数组 const result = []; // 定义一个计数器用来判断是否所有的promise执行完毕 let count = 0; // 并发执行每一个promise for (let i = 0; i < promises.length; i++) { Promise.resolve(promises[i]).then(res => { result[i] = res; count++; if (count === promises.length) { resolve(result); } }).catch(err => reject(err)) } }) }
其中,Promise属于同步任务,then属于微任务
事件轮询EventLoop
- Js从诞生起就是单线程。js作为主要允许在浏览器的脚本语言,主要用途之一就是操作DOM。如果出现两个线程,同时对同一个DOM进行操作,这时浏览器应该听哪个线程需要考虑很多因素。为了避免这种情况,js必须是一门单线程语言
- EventLoop为了解决I/O操作时,由于一个任务需要长时间等待,而浪费资源问题。
- 即,程序中会设置两个线程,一个负责程序本身的允许,称为“主线程”;另一个负责与主线程的通信,即任务队列,只有任务队列通知主线程,某个异步任务才可以执行,该任务才能进入主线程