promise理解
Promise本意是承诺,在程序中的意思就是承诺我过一段时间后会给你一个结果:
什么时候会用到过一段时间?
是异步操作
异步是指可能比较长时间才有结果的才做,例如网络请求、读取本地文件等
Promise的状态
一个Promise的当前状态必须为以下三种状态中的一种
等待态(Pending)
处于等待态时,promise需满足以下条件:
可以迁移至执行态或拒绝态
执行态(Fulfilled)
处于执行态时,promise 需满足以下条件:
不能迁移至其他任何状态
必须拥有一个不可变的终值
拒绝态(Rejected)
处于拒绝态时,promise需要满足以下条件
不能迁移至其他任何状态
必须拥有一个不可变的据因
Then方法
一个promise必须提供一个then方法以访问其当前值、终值和据因
promise的then方法接受两个参数:
promise.then(onFulfilled, onRejected)
onFulfilled 和 onRejected 都是可选参数
- 如果onFullfilled不是函数,其必须被忽略
- 如果onRejected不是函数,其必须被忽略
onFulfilled特性
如果onFulfilled是函数:
- 当promise执行结束后其必须被调用,其第一个参数为promise的终值
- 在promise执行结束前其不可被调用
- 其调用次数不可超过一次
onRejected特性
如果onRejected是函数:
- 当 promise 被拒绝执行后其必须被调用,其第一个参数为 promise 的据因
- 在 promise 被拒绝执行前其不可被调用
- 其调用次数不可超过一次
调用时机
onFulfilled 和 onRejected 只有在执行环境堆栈仅包含平台代码时才可被调用
调用要求
onFulfilled 和 onRejected 必须被作为函数调用(即没有 this 值)
多次调用
then 方法可以被同一个promise调用多次
-
当 promise 成功执行时,所有 onFulfilled 需按照其注册顺序依次回调
-
当 promise 被拒绝执行时,所有的 onRejected 需按照其注册顺序依次回调
返回
then 方法必须返回一个 promise 对象
promise.js
class Promise {
constructor(executor){
//不能相信用户的输入,所以这里要做参数效验
if(typeof executor !== 'function'){
throw new TypeError('Promise resolver ${executor} is not a function')
}
this.initValue()
this.initBind()
try{
executor(this.resolve, this.reject)
}catch(e){
this.reject(e)
}
}
//绑定 this
initBind(){
this.resolve = this.resolve.bind(this)
this.reject = this.reject.bind(this)
}
//进行代码的优化
initValue(){
//记录状态和值的改变
//初始化值
this.value = null //终值
this.reason = null //拒因
this.state = Promise.PENDING //状态
this.onFulfilledCallbacks = []//成功回调
this.onRejectedCallbacks = [] //失败回调
}
resolve(value){
//成功后的一系列操作(状态的改变,成功回调的执行)
if(this.state === Promise.PENDING){
//状态进行改变
this.state = Promise.FULFILLED
//执行成功的回调,把终值进行赋值
this.value = value
//成功或者失败以后进行这两个数组的执行
this.onFulfilledCallbacks.forEach((fn) => fn(this.value)
)}
}
reject(reason){
//失败后的一系列操作(状态的改变,失败回调的执行)
if(this.state === 'pending'){
//状态进行改变
this.state = Promise.REJECTED
//执行成功的回调,把据因进行赋值
this.reason = reason
this.onRejectedCallbacks.forEach(fn => fn(this.reason))
}
}
then(onFulfilled, onRejected) {
// 参数效验
if (typeof onFulfilled !== 'function'){
onFulfilled = function(value) {
return value
}
}
if (typeof onRejected !== 'function'){
onRejected = function(reason){
throw reason
}
}
// 实现链式调用,且改变了后面的then的值,必须通过新的实例
let promise2 = new Promise((resolve, reject) => {
if(this.state === Promise.FULFILLED){
setTimeout(() => {
try{
const x = onFulfilled(this.value)
resolve(x)
}catch(e){
reject(e)
}
})
}
if(this.state === Promise.REJECTED){
setTimeout(() => {
try{
const x = onRejected(this.reason)
resolve(x)
}catch(e){
reject(e)
}
})
}
//在promise.js里面肯定要追加一个状态的判断
if(this.state === Promise.PENDING){
this.onFulfilledCallbacks.push((value) => {
setTimeout(() => {
try{
const x = onFulfilled(value)
resolve(x)
}catch(e){
reject(e)
}
})
})
this.onRejectedCallbacks.push((reason) => {
setTimeout(() => {
try{
const x = onRejected(this.reason)
resolve(x)
}catch(e){
reject(e)
}
})
})
}
})
return promise2
}
}
Promise.PENDING = 'pending'
Promise.FULFILLED = 'fulfilled'
Promise.REJECTED = 'reject'
Promise.resolvePromise = function(promise2, x, resolve, reject){}
module.exports = Promise