解决什么问题
解决异步操作函数里的多层嵌套回调(回调地狱)
原理(看 promise.js)
创建 Promise 构造函数, 添加 resolve 、reject、then、catch、finally 等方法。Promise 入参是个回调函数,执行回调函数得到的正确结果通过 resolve 方法传送到 then 方法,错误结果通过 reject 方法传送到 catch 方法。因为 Promise 是异步的, 所以需要有异步的方法来执行回调函数。浏览器端,采用的是 window.MutationObserver || setTimeout || setInterval 三个方法来执行异步回调,服务端则采用的是 setImmediate || process.nextTick 来执行回调。总的来说就是采用异步方法去执行入参的回调函数,每一个链式的每一个 then 都会触发一次异步回调。
三种状态
- Fulfilled:Promise执行成功
- Rejected:Promise执行失败
- Pending:Promise正在执行中
一个promise的状态只可能从pending 变为 fulfilled ,或者 pending 变为 rejected,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换。
API概述
- 构造器
const p = new Pomise((resolve, reject) => {
// resolve(...) 决议/完成
// reject(...) 用于拒绝这个promise
})
-
原型方法
then/catch/finally -
本身方法
- Promise.all([…]) :按顺序全部执行
- Promise.race([…]):返回执行最快的一个promise结果
- Promise.resolve()
- Promise.reject()
- Promise.finally() —ES9(2018)
- Promise.allSettled() —ES11(2020)
- Promise.any() —ES12(2021)
thenable对象
- 定义:具有then(…)方法的对象和函数
- 所有的Promise都是thenable对象,但并非所有thenable对象都是Promise
Promise/A+规范
主要Promise方法是都含有new Promise(function(resolve, reject){})、then、resolve等方法
与setTimeout的区别
promise 是微任务,setTimeout 是宏任务,同一个事件循环中,promise.then 总是先于 setTimeout 执行。