#promise中核心思想:状态一旦发生变更就不可再更改,由pending->fulfilled/rejected。then()只能由promise来调用。then()的链式调用以及穿透都是通过返回新的promise来实现的
#最简版的promise
class MyPromise {
// promise的三种状态
static PENDING = 'pending'
static FULFILLED = 'fulfilled'
static REJECTED = 'rejected'
constructor(executor) {
this.status = MyPromise.PENDING // 保存当前状态,默认为pending
this.value = '' // 存储状态为fulfilled时的值
this.reason = '' // 存储状态为rejected时的值
executor(this.resolve.bind(this), this.reject.bind(this)) // 将this绑定到resolve和reject中,以此来拿到构造函数中定义的值
}
resolve(value) {
if(this.status === MyPromise.PENDING) { // 为了保证每次只能执行一个状态的改变
this.status = MyPromise.FULFILLED
this.value = value // 将传递进来的值保存,以便传递给下一步then()
}
}
reject(reason) {
if(this.status === MyPromise.PENDING) { // 为了保证每次只能执行一个状态的改变
this.status = MyPromise.REJECTED
this.reason = reason // 将传递进来的值保存,以便传递给下一步then()
}
}
then(onFulfilled, onRejected) {
if(this.status === MyPromise.FULFILLED) {
onFulfilled(this.value)
}
if(this.status === MyPromise.REJECTED) {
onRejected(this.reason)
}
}
}
#如果在then中发生了错误的话将错误抛给onRejected来处理,在promise中,then()属于微任务异步执行的,所以加上setTimeout
new MyPromise((resolve, reject) => {
resolve('解决')
})
.then(
value =>{
console.log('resolve = ' + value111) //如果在这里发生错误,则将异常要抛入到onRejected
},
reason => {
console.log('reject = ' + reason)
}
)
console.log('这是先执行的')
then(onFulfilled, onRejected) {
if(this.status === MyPromise.FULFILLED) {
setTimeout(() => {
try {
onFulfilled(this.value)
} catch (e) {
onRejected(e) //如果then()中有错误发生,则将错误信息捕获放入onRejected中
}
})
}
if(this.status === MyPromise.REJECTED) {
setTimeout(() => {
try {
onRejected(this.reason)
} catch (e) {
onRejected(e)
}
})
}
}
#在promise中,可能会在异步执行之后, 拿到异步执行的结果在使用resolve/reject.新增了callback用于存放resolve之后需要调用的函数 当在异步调用resolve/reject,此时then()的状态pending,先将要执行的onfulfilled/onRejected保存起来,带resolve/reject之后再来调用
new MyPromise((resolve, reject) => {
setTimeout(() => {
reject('异步状态')
})
})
.then(
value =>{
console.log('resolve = ' + value)
},
reason => {
console.log('reject = ' + reason)
}
)
resolve(value) {
if(this.status === MyPromise.PENDING) {
this.status = MyPromise.FULFILLED
this.value = value
this.callBacks.map(callback =>{// 如果异步完成后执行resolve,则调用保存的函数
callback.onFulfilled(this.value)
})
}
}
reject(reason) {
if(this.status === MyPromise.PENDING) {
this.status = MyPromise.REJECTED
this.reason = reason
this.callBacks.map(callback => { // 如果异步完成后执行resolve,则调用保存的函数
callback.onRejected(this.reason)
})
}
}
then(onFulfilled, onRejected) {
if(this.status === MyPromise.PENDING) {
this.callBacks.push({ // **在异步执行resolve时,先将函数保存起来,等到resolve或者reject之后再来执行该函**
onFulfilled,
onRejected
})
}
if(this.status === MyPromise.FULFILLED) {
setTimeout(() => {
try {
onFulfilled(this.value) //如果then()中有错误发生,则将错误信息捕获放入onRejected中
} catch (e) {
onRejected(e)
}
})
}
if(this.status === MyPromise.REJECTED) {
setTimeout(() => {
try {
onRejected(this.reason)
} catch (e) {
onRejected(e)
}
})
}
}
#在我们在上面这种情况下调用then里面的函数,此时可能会出现代码错误(例如调用了不存在的变量),所以我们统一将错误信息抛到reject中去处理
new MyPromise((resolve, reject) => {
setTimeout(() => {
resolve('异步状态')
})
})
.then(
value =>{
console.log('resolve = ' + ABC) // 例如这里调用了一个不存在的变量
},
reason => {
console.log('reject = ' + reason)
}
)
then(onFulfilled, onRejected) {
if(this.status === MyPromise.PENDING) {
this.callBacks.push({ // 在异步执行resolve时,先将函数保存起来,等到resolve或者reject之后再来执行该函数
onFulfilled: (value) => { // 这个onfulfilled是属性名, value值就是在resolve中调用onfulfilled传递进来的值
try { //使用try catch将捕获的错误传递到onRejected中
onFulfilled(value) // 这个onfulfilled是函数
} catch (e) {
onRejected(e)
}
},
onRejected: (reason) => {
try {
onRejected(reason)
}catch (e) {
onRejected(e)
}
}
})
}
if(this.status === MyPromise.FULFILLED) {
setTimeout(() => {
try {
onFulfilled(this.value) //如果then()中有错误发生,则将错误信息捕获放入onRejected中
} catch (e) {
onRejected(e)
}
})
}
if(this.status === MyPromise.REJECTED) {
setTimeout(() => {
try {
onRejected(this.reason)
} catch (e) {
onRejected(e)
}
})
}
}
#在promise中,以下代码应该执行的顺序为 这是最后面->此处被执行到->解决
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('解决')
console.log('此处被执行到')
})
})
.then(value => {
console.log(value)
},reason => {
console.log('reason = ' + reason)
})
console.log('这是最后面')
##为了实现该效果,我们把callbacks变成异步执行。到这里,此时已经完成了初步的promise,之后的其他操作都是基于这一个promise来循环操作
resolve(value) {
if(this.status === MyPromise.PENDING) { // 为了保证每次只能执行一个状态的改变
this.status = MyPromise.FULFILLED
this.value = value // 将传递进来的值保存,以便传递给下一步then()
// 如果异步完成后执行resolve,则调用保存的函数
setTimeout(() => {
this.callBacks.map(callback =>{
callback.onFulfilled(this.value)
})
})
}
}
reject(reason) {
if(this.status === MyPromise.PENDING) { // 为了保证每次只能执行一个状态的改变
this.status = MyPromise.REJECTED
this.reason = reason // 将传递进来的值保存,以便传递给下一步then()// 如果异步完成后执行rejected,则调用保存的函数
setTimeout(() =>{
this.callBacks.map(callback => {
callback.onRejected(this.reason)
})
})
}
}
#promise链式操作,首先要明白一个概念,当前then中的状态不会影响下一个then中的状态。
new Promise((resolve, reject) => {
reject('拒绝')
})
.then(value => {
console.log(value)
},reason => { // 这里虽然是在onReject方法中执行的操作,但是在下一个then()中的onFulfilled是可以接收到的
console.log('reason = ' + reason)
return '新的promise不会影响下一个' // 这里不会影响下一个then的状态
})
.then(value => {
console.log(value) // 此处会打印出 新的promise不会影响下一个,
}, reason => {})
##要实现链式操作,核心原理就是在then()中返回一个新的promise,并且把then中return的值拿到传给这个新的promise,因为在then()中通过return,所以我们直接执行onFulfilled或者onRejected即可拿到return中的值
new MyPromise((resolve, reject) => {
setTimeout(() => {
reject('异步状态')
})
})
.then(
value =>{},
reason => {
console.log('reject = ' + reason)
return '传递给下一个promise的值'
}
)
.then(value => { // 要想调用then方法,则必须返回一个新的promise状态
console.log(value)
})
then(onFulfilled, onRejected) {
let promise; // 定义一个promise,在then()调用时候返回该promise
if(this.status === MyPromise.PENDING) {
promise = new MyPromise((resolve, reject) => {
this.callBacks.push({
onFulfilled: (value) => {
try {
let result = onFulfilled(value)
resolve(result)
} catch (e) {
onRejected(e)
}
},
onRejected: (reason) => {
try {
let result = onRejected(reason) // 这里可以拿到上面代码中return的值:‘传递给下一个promise的值’
resolve(result)
}catch (e) {
onRejected(e)
}
}
})
})
}
if(this.status === MyPromise.FULFILLED) {
promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
try {
let result = onFulfilled(this.value) // 在then()中调用的onFulfilled或者onRejected中的return的值,即等于该函数执行完之后的值,拿到该值之后,重新resolve一下,传递给下一个promise
resolve(result)
} catch (e) {
onRejected(e)
}
})
})
}
if(this.status === MyPromise.REJECTED) {
promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
try {
let result = onRejected(this.reason)
resolve(result) // 因为当前then状态不会影响下一个promise的状态,所以都是用resolve来调用新的promise
} catch (e) {
onRejected(e)
}
})
})
}
console.log(promise)
return promise // 返回一个新的promise后就可以继续调用then()
}
#then()穿透的实现 ##在promise中,当then()没有进行任何操作的时候,会将当前状态和状态值传递给下一个then()
// 下面代码打印出来的是 ->resolve解决
new Promise((resolve, reject) => {
resolve('解决')
})
.then()
.then(value => {
console.log('resolve = ' + value)
return 'resolve promise'
},reason => {
console.log('reject = ' + reason)
return '新的promise'
})
// 下面代码打印出来的是->reject失败
new Promise((resolve, reject) => {
reject('失败')
})
.then()
.then(value => {
console.log('resolve = ' + value)
return 'resolve promise'
},reason => {
console.log('reject = ' + reason)
return '新的promise'
})
**如果有then()未执行任何操作时,则将当前状态传递给下一个then(),如果执行了操作,则下一个状态为resolve**
###如果onFulfilled和onRejected不是函数时,手动拿到上一个状态值赋值给该函数,这样可以将上一个值传递给下一个then(),实现then()的穿透。如果上一个状态为reject,且then()没有操作时,将reject传递给下一个then()。所以添加了一个标志位rejectStatus
then(onFulfilled, onRejected) {
let promise;
let rejectStatus = false // 用于标志当前then()是否未进行任何操作,且上一个状态为reject
if(typeof onFulfilled !== 'function') { // 防止传递进来的不是一个函数
onFulfilled = () => this.value // 这样就可以拿到上一个promise的值了
// onFulfilled = () => { return this.value} // 和上面等效
}
if(typeof onRejected !== 'function') {
onRejected = () => this.reason
rejectStatus = true // 当没有onReject传递进来时,则置为true
}
if(this.status === MyPromise.PENDING) {
promise = new MyPromise((resolve, reject) => {
this.callBacks.push({
onFulfilled: (value) => {
try {
let result = onFulfilled(value)
resolve(result)
} catch (e) {
reject(e) // 将上一个then()中的错误信息抛给下一个then() 下面同理
}
},
onRejected: (reason) => {
try {
let result = onRejected(reason)
if(rejectStatus) { // 当状态为reject,且then()无操作时,则将reject状态传递给下一个then()方法。否则传递resolve()
reject(result)
} else {
resolve(result)
}
}catch (e) {
reject(e)
}
}
})
})
}
if(this.status === MyPromise.FULFILLED) {
promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
try { //如果then()中有错误发生,则将错误信息捕获放入onRejected中
let result = onFulfilled(this.value) // 在then()中调用的onFulfilled或者onRejected中的return的值,即等于该函数执行完之后的值,拿到该值之后,重新resolve一下,传递给下一个promise
resolve(result)
} catch (e) {
reject(e)
}
})
})
}
if(this.status === MyPromise.REJECTED) {
promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
try {
let result = onRejected(this.reason)
if(rejectStatus) {
reject(result)
} else {
resolve(result) // 因为当前then状态不会影响下一个promise的状态,所以都是用resolve来调用新的promise
}
} catch (e) {
reject(e)
}
})
})
}
return promise // 返回一个新的promise后就可以继续调用then()
}
#在promise中,then()有时候会返回一个新的promise, 在resolve或者reject中返回一个新的promise,是可以将该promise中resolve/reject的值传递下一个then()
new Promise((resolve, reject) => {
resolve('失败')
})
.then(value => {
return new Promise((resolve, reject) => {
reject('返回promise')
})
},reason => {
console.log('reject = ' + reason)
return '新的promise'
})
.then(value => {
console.log(value)
}, reason => {
console.log(reason) // 此处会拿到 返回promise
})
##实现then()中返回promise时的数据传递
then(onFulfilled, onRejected) {
let promise;
let rejectStatus = false // 用于标志当前then()是否未进行任何操作,且上一个状态为reject
if(typeof onFulfilled !== 'function') { // 防止传递进来的不是一个函数
onFulfilled = () => this.value
}
if(typeof onRejected !== 'function') {
onRejected = () => this.reason
rejectStatus = true // 当没有onReject传递进来时,则置为true
}
if(this.status === MyPromise.PENDING) {
promise = new MyPromise((resolve, reject) => {
this.callBacks.push({
onFulfilled: (value) => {
try {
let result = onFulfilled(value)
if(result instanceof MyPromise) { //判断返回的是否是一个promise对象
result.then(value => { // 因为result是一个promise,我们直接去调用他的then()方法拿到结果
resolve(value) // **此处resolve的是我们在这里new出来的对象promise的函数,这个promise是我们将最终then()出去的结果,不是then()中返回来的这个,切勿弄乱,其他同样代码同理**
}, reason => {
reject(reason)
})
} else {
resolve(result)
}
} catch (e) {
reject(e) // 将上一个then()中的错误信息抛给下一个then() 下面同理
}
},
onRejected: (reason) => {
try {
let result = onRejected(reason)
if(result instanceof MyPromise) {
result.then(value => {
resolve(value)
}, reason => {
reject(reason)
})
} else {
if(rejectStatus) {
reject(result)
} else {
resolve(result)
}
}
}catch (e) {
reject(e)
}
}
})
})
}
if(this.status === MyPromise.FULFILLED) {
promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
try { //如果then()中有错误发生,则将错误信息捕获放入onRejected中
let result = onFulfilled(this.value)
if(result instanceof MyPromise) { // 判断返回的状态是否是promise
result.then(value => {
resolve(value)
}, reason => {
reject(reason)
})
} else {
resolve(result)
}
} catch (e) {
reject(e)
}
})
})
}
if(this.status === MyPromise.REJECTED) {
promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
try {
let result = onRejected(this.reason)
if (result instanceof MyPromise) {
result.then((value) =>{resolve(value)}, reason => {
reject(reason)
})
} else {
if(rejectStatus) {
reject(result)
} else {
resolve(result) // 因为当前then状态不会影响下一个promise的状态,所以都是用resolve来调用新的promise
}
}
} catch (e) {
reject(e)
}
})
})
}
return promise // 返回一个新的promise后就可以继续调用then() 返回的状态时pending 因为resolve/reject在执行时是异步的
}
#在promise中是不允许返回自己的(返回类型约束) 此时会报错
let mpromise = new Promise((resolve, reject) => {
resolve('失败')
})
let p = mpromise.then(value => {
return p
})
##w为了对他的返回值进行约束,对于返回的值进行判断,如果等于自身,则报错 Chaining cycle detected for promise
then(onFulfilled, onRejected) {
let promise;
let rejectStatus = false
if(typeof onFulfilled !== 'function') {
onFulfilled = () => this.value
}
if(typeof onRejected !== 'function') {
onRejected = () => this.reason
rejectStatus = true
}
if(this.status === MyPromise.PENDING) {
promise = new MyPromise((resolve, reject) => {
this.callBacks.push({
onFulfilled: (value) => {
try {
let result = onFulfilled(value) // 这个onfulfilled是函数 **在返回promise中,这里拿到返回的promise值**
if (promise === result) { // 不能返回本身
throw new TypeError('Chaining cycle detected for promise')
}
if(result instanceof MyPromise) {
result.then(value => {
resolve(value)
}, reason => {
reject(reason)
})
} else {
resolve(result)
}
} catch (e) {
reject(e)
}
},
onRejected: (reason) => {
if (promise === onRejected(reason)) { // 不能返回本身
throw new TypeError('Chaining cycle detected for promise')
}
try {
let result = onRejected(reason)
if(result instanceof MyPromise) {
result.then(value => {
resolve(value)
}, reason => {
reject(reason)
})
} else {
if(rejectStatus) {
reject(result)
} else {
resolve(result)
}
}
}catch (e) {
reject(e)
}
}
})
})
}
if(this.status === MyPromise.FULFILLED) {
promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
// this.parse(onFulfilled(this.value), resolve, reject)
try {
let result = onFulfilled(this.value)
if (promise === result) { // 不能返回本身
throw new TypeError('Chaining cycle detected for promise')
}
if(result instanceof MyPromise) { // 判断返回的状态是否是promise
result.then(value => {
resolve(value)
}, reason => {
reject(reason)
})
} else {
resolve(result)
}
} catch (e) {
reject(e)
}
})
})
}
if(this.status === MyPromise.REJECTED) {
promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
try {
let result = onRejected(this.reason)
if (promise ===result) { // 不能返回本身
throw new TypeError('Chaining cycle detected for promise')
}
if (result instanceof MyPromise) {
result.then((value) =>{resolve(value)}, reason => {
reject(reason)
})
} else {
if(rejectStatus) {
reject(result)
} else {
resolve(result) // 因为当前then状态不会影响下一个promise的状态,所以都是用resolve来调用新的promise
}
}
} catch (e) {
reject(e)
}
})
})
}
return promise // 返回一个新的promise后就可以继续调用then() 返回的状态时pending 因为resolve/reject在执行时是异步的
}
#promise静态方法的实现 核心原理还是只有promise才能调用then()方法,且promise的状态只能被更改一次
catch(onRejected) { // 将捕获的报错信息从这里抛出
return this.then(null, onRejected)
}
promise.resolve('aaa').then(value =>{}, reason => {}) // 静态方法调用,核心都是返回一个promise
static resolve(value) {
return new MyPromise((resolve, reject) => {
if(value instanceof MyPromise) { // 如果调用静态方法resolve时值为新的promise
if(value instanceof MyPromise) { // 判断返回的状态是否是promise
value.then(value1 => {
resolve(value1)
}, reason => {
reject(reason)
})
} else {
resolve(value)
}
} else {
resolve(value)
}
})
}
static reject(reason) {
return new MyPromise((resolve, reject) => {
reject(reason)
})
}
static all(promises) { // 如果有一个错,就返回reject,如果全对,则返回resolve
return new MyPromise((resolve, reject) => {
let resolves = []
promises.forEach(promise => {
promise.then(value => {
resolves.push(value)
if(resolves.length === promises.length) {
resolve(resolves)
}
}, reason => {
reject(reason)
})
})
})
}
static race(promises) { // 谁先执行结束返回谁
return new MyPromise((resolve, reject) => {
promises.map(promise => {
promise.then(value => {
resolve(value)
}, reason => {
reject(reason)
})
})
})
}
#代码合并(最终完整代码)
class MyPromise {
// promise的三种状态
static PENDING = 'pending'
static FULFILLED = 'fulfilled'
static REJECTED = 'rejected'
constructor(executor) {
this.status = MyPromise.PENDING // 保存当前状态,默认为pending
this.value = '' // 存储状态为fulfilled时的值
this.reason = '' // 存储状态为rejected时的值
this.callBacks = [] // 用于存放回调函数
executor(this.resolve.bind(this), this.reject.bind(this)) // 将this绑定到resolve和reject中,以此来拿到构造函数的值
}
resolve(value) {
if (this.status === MyPromise.PENDING) { // 为了保证每次只能执行一个状态的改变
this.status = MyPromise.FULFILLED
this.value = value // 将传递进来的值保存,以便传递给下一步then()
// 如果异步完成后执行resolve,则调用保存的函数,确保then()是在resolve/reject之后调用的
setTimeout(() => {
this.callBacks.map(callback => {
callback.onFulfilled(this.value)
})
})
}
}
reject(reason) {
if (this.status === MyPromise.PENDING) {
this.status = MyPromise.REJECTED
this.reason = reason // 将传递进来的值保存,以便传递给下一步then()// 如果异步完成后执行rejected,则调用保存的函数
setTimeout(() => {
this.callBacks.map(callback => {
callback.onRejected(this.reason)
})
})
}
}
then(onFulfilled, onRejected) { // 每一次then()之后下一个then()状态都是pending
let promise;
let rejectStatus = false // 用于标志当前then()是否未进行任何操作,且上一个状态为reject
if (typeof onFulfilled !== 'function') { // 防止传递进来的不是一个函数
onFulfilled = () => this.value
}
if (typeof onRejected !== 'function') {
onRejected = () => this.reason
rejectStatus = true // 当没有onReject传递进来时,则置为true
}
if (this.status === MyPromise.PENDING) {
promise = new MyPromise((resolve, reject) => {
this.callBacks.push({ // 在异步执行resolve时,先将函数保存起来,等到resolve或者reject之后再来执行该函数
onFulfilled: (value) => { // 这个onfulfilled是属性名, value值就是在resolve中调用onfulfilled传递进来的值
this.resolveParse(promise, onFulfilled(value), resolve, reject)
// try {
// let result = onFulfilled(value) // 这个onfulfilled是函数 **在返回promise中,这里拿到返回的promise值**
// if (promise === result) { // 不能返回本身
// throw new TypeError('Chaining cycle detected for promise')
// }
// if (result instanceof MyPromise) {
// result.then(value => {
// resolve(value) // **此处resolve的是我们在这里new出来的对象promise的函数,这个promise是我们将最终then()出去的结果,不是then()中返回来的这个,切勿弄乱**
// }, reason => {
// reject(reason)
// })
// } else {
// resolve(result)
// }
// } catch (e) {
// reject(e) // 将上一个then()中的错误信息抛给下一个then() 下面同理
// }
},
onRejected: (reason) => {
this.rejectParse(promise, onRejected(reason), resolve, reject, rejectStatus)
// try {
// let result = onRejected(reason)
// if (promise === result) { // 不能返回本身
// throw new TypeError('Chaining cycle detected for promise')
// }
// if (result instanceof MyPromise) {
// result.then(value => {
// resolve(value)
// }, reason => {
// reject(reason)
// })
// } else {
// if (rejectStatus) { // 当状态为reject,且then()无操作时,则将reject状态传递给下一个then()方法。否则传递resolve()
// reject(result)
// } else {
// resolve(result)
// }
// }
// } catch (e) {
// reject(e)
// }
}
})
})
}
if (this.status === MyPromise.FULFILLED) {
promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
this.resolveParse(onFulfilled(this.value), resolve, reject) // 将下面代码放入函数中
// try { //如果then()中有错误发生,则将错误信息捕获放入onRejected中
// let result = onFulfilled(this.value) // 在then()中调用的onFulfilled或者onRejected中的return的值,即等于该函数执行完之后的值,拿到该值之后,重新resolve一下,传递给下一个promise
// if (promise ===result) { // 不能返回本身 因为这里是异步执行的,所以可以先拿到自己本身的值 然后再进行比较
// throw new TypeError('Chaining cycle detected for promise')
// }
// if(result instanceof MyPromise) { // 判断返回的状态是否是promise
// result.then(value => {
// resolve(value)
// }, reason => {
// reject(reason)
// })
// } else {
// resolve(result)
// }
// } catch (e) {
// reject(e)
// }
})
})
}
if (this.status === MyPromise.REJECTED) {
promise = new MyPromise((resolve, reject) => {
setTimeout(() => { // 因为then()是微任务,所以加了延时器
this.rejectParse(promise, onRejected(this.reason), resolve, reject, rejectStatus)
// try {
// let result = onRejected(this.reason)
// if (promise === result) { // 不能返回本身
// throw new TypeError('Chaining cycle detected for promise')
// }
// if (result instanceof MyPromise) {
// result.then((value) => {
// resolve(value)
// }, reason => {
// reject(reason)
// })
// } else {
// if (rejectStatus) {
// reject(result)
// } else {
// resolve(result) // 因为当前then状态不会影响下一个promise的状态,所以都是用resolve来调用新的promise
// }
// }
//
// } catch (e) {
// reject(e)
// }
})
})
}
return promise // 返回一个新的promise后就可以继续调用then() 返回的状态时pending 因为resolve/reject在执行时是异步的
}
catch(onRejected) {
return this.then(null, onRejected)
}
resolveParse(promise, result, resolve, reject) {
try { //如果then()中有错误发生,则将错误信息捕获放入onRejected中
if (promise === result) { // 不能返回本身 因为这里是异步执行的,所以可以先拿到自己本身的值 然后再进行比较
throw new TypeError('Chaining cycle detected for promise')
}
if (result instanceof MyPromise) { // 判断返回的状态是否是promise
result.then(value => {
resolve(value)
}, reason => {
reject(reason)
})
} else {
resolve(result)
}
} catch (e) {
reject(e)
}
}
rejectParse(promise, result, resolve, reject, status) {
try {
if (promise === result) { // 不能返回本身
throw new TypeError('Chaining cycle detected for promise')
}
if (result instanceof MyPromise) {
result.then((value) => {
resolve(value)
}, reason => {
reject(reason)
})
} else {
if (status) {
reject(result)
} else {
resolve(result) // 因为当前then状态不会影响下一个promise的状态,所以都是用resolve来调用新的promise
}
}
} catch (e) {
reject(e)
}
}
static resolve(value) {
return new MyPromise((resolve, reject) => {
if (value instanceof MyPromise) { // 如果调用静态方法resolve时值为新的promise
if (value instanceof MyPromise) { // 判断返回的状态是否是promise
value.then(value1 => {
resolve(value1)
}, reason => {
reject(reason)
})
} else {
resolve(value)
}
} else {
resolve(value)
}
})
}
static reject(reason) {
return new MyPromise((resolve, reject) => {
reject(reason)
})
}
static all(promises) {
return new MyPromise((resolve, reject) => {
let resolves = []
promises.forEach(promise => {
promise.then(value => {
resolves.push(value)
if (resolves.length === promises.length) {
resolve(resolves)
}
}, reason => {
reject(reason)
})
})
})
}
static race(promises) {
return new MyPromise((resolve, reject) => {
promises.map(promise => {
promise.then(value => {
resolve(value)
}, reason => {
reject(reason)
})
})
})
}
}