Promise
promise 是一个构造函数,他的参数是一个 function,new promise()时传入的函数会立即执行
- 特点:维护一个状态机,有 pending,fulfilled,rejected 三种状态,一旦状态改变了后不会再变
- 作用:链式调用,避免回调函数结构复杂
- 结构: Promise 中有 all,race,resolve,reject 等方法,Promise.prototype 有 then,catch,finally 等方法
all()
- 接受 promise 对象,返回所有对象 resolve 的结果,返回结构为数组,是一个 promise 实例
- 若有 reject,则返回最先 rejected 状态的 reject 结果
race()
- 返回最先 resolve 或最先 reject 的结果,返返回 promise
then()
- 接受两个参数,两个参数分别为两个函数,返回 promise 对象
- 参数一:resolve 时执行;参数二:reject 执行
catch()
- 接受 reject 参数
- 也接受发生异常时调用的参数
finally()
- 无论状态是什么都会执行的函数
实现
- 基础框架
function MyPromise(fn){
function resolve(data){
console.log(data)
}
function reject(data){
console.log(data)
}
try{
fn(resolve,reject)
}catch(e){
reject(e)
}
}
- 添加状态机
const PENDING = 'pending'
const FULFILLED = 'fulfilled'
const REJECTED = 'rejected'
function MyPromise(fn){
let self = this;
self.state = PENDING;
function resolve(data){
if(self.state === PENDING){
self.state = FULFILLED;
}
}
function reject(data){
if(self.state === PENDING){
self.state = REJECTED
}
}
try{
fn(resolve,reject)
}catch(e){
reject(e)
}
}
- then()
const PENDING = 'pending'
const FULFILLED = 'fulfilled'
const REJECTED = 'rejected'
function MyPromise(fn){
let self = this;
self.state = PENDING;
self.value = null;
self.reason = null;
function resolve(data){
if(self.sta