const l = console.log
const PENDING = 'pending'
const FULFILLED = 'fulfilled'
const REJECTED = 'rejected'
// Object.defineProperty(x, then, {
// get() {
// return new Error()
// }
// })
const resolvePromise = (promise2, x, resolve, reject) => {
if (promise2 === x) {
return reject(new TypeError('Chaining cycle detected for promise'))
}
if (typeof x === 'object' && x !== null || typeof x === 'function') {
try {
let then = x.then // Object.defineProperty
if (typeof then === 'function') {
// x.then 万一在报错
then.call(x, (y) => {
resolve(y)
}, (r) => {
reject(r)
})
} else {
resolve(x)
}
} catch(e) {
reject(e)
}
} else {
resolve(x)
}
}
class PPromise {
constructor(executor) {
this.status = PENDING
this.value = void(0)
this.reason = void(0)
this.onResolvedCallbacks = []
this.onRejectedCallbacks = []
let resolve = (val) => {
if (this.status === PENDING) {
this.status = FULFILLED
this.value = val
this.onResolvedCallbacks.forEach(fn => fn())
}
}
let reject = (reason) => {
if (this.status === PENDING) {
this.status = REJECTED
this.reason = reason
this.onRejectedCallbacks.forEach(fn => fn())
}
}
try {
executor(resolve, reject)
} catch(error) {
l(error)
reject(error)
}
}
then(onFulfilled, onRejected) {
let promise2 = new PPromise((resolve, reject) => {
// 如何将1000传到这
if (this.status === FULFILLED) {
setTimeout(() => { // 宏任务
try {
// 如何拿到return 1000的1000,然后传给下个then
let x = onFulfilled(this.value) // 1000
// then时返回promise才能接着.then
// resolve(x)
// 如果是promise就需要看x的value和status
// l('promise2???????', promise2)
resolvePromise(promise2, x, resolve, reject)
} catch(e) {
// 捕获 onFulfilled的异常,下个then接收
reject(e)
}
})
}
if (this.status === REJECTED) {
setTimeout(() => { // 宏任务
try {
// 如何拿到return 1000的1000,然后传给下个then
let x = onRejected(this.reason) // 1000
// then时返回promise才能接着.then
// resolve(x)
// 如果是promise就需要看x的value和status
// l('promise2???????', promise2)
resolvePromise(promise2, x, resolve, reject)
} catch(e) {
// 捕获 onFulfilled的异常,下个then接收
console.log('e:', e)
reject(e)
}
})
}
if (this.status === PENDING) {
this.onResolvedCallbacks.push(() => {
setTimeout(() => { // 宏任务 自己没法模拟微任务
try {
// 如何拿到return 1000的1000,然后传给下个then
let x = onFulfilled(this.value) // 1000
// then时返回promise才能接着.then
// resolve(x)
// 如果是promise就需要看x的value和status
// l('promise2???????', promise2)
resolvePromise(promise2, x, resolve, reject)
} catch(e) {
// 捕获 onFulfilled的异常,下个then接收
reject(e)
}
})
})
this.onRejectedCallbacks.push(() => {
setTimeout(() => { // 宏任务
try {
// 如何拿到return 1000的1000,然后传给下个then
let x = onRejected(this.reason) // 1000
// then时返回promise才能接着.then
// resolve(x)
// 如果是promise就需要看x的value和status
// l('promise2???????', promise2)
resolvePromise(promise2, x, resolve, reject)
} catch(e) {
// 捕获 onFulfilled的异常,下个then接收
reject(e)
}
})
})
}
})
return promise2
}
}
const p = new PPromise((resolve, reject) => {
resolve('haha')
})
const p2 = p.then((val) => {
// throw new Error('then onFulfilled执行时如何catch,构造函数中的只能捕获同步异常') // 跟resolvePromise无关
// return 1000
return new Promise((resolve, reject) => {
reject(100)
})
})
p2.then(val => {
l(val)
}, error => {
l('hahah error')
return 100
}).then(data => {
l(data)
})
学习promise过程
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 1.Promise定义 (1)Promise是用来封装一个异步操作并可以获取其结果的构造函数;(2)Promise...
- 成长记录-连载(三十六) ——我的第一篇五千字长文,说了什么,你一定想不到 并不是不想每天写公众号,而是之前思考怎...
- 怎样反思自己的教学——学习杜威《我们怎样思维》有感 2015-01-13 14:56:52 来源:普宁市第三中学网...
- 「原创」 海恒顾问 刘保松 定位——我们聚焦于学习实践与落地应用,而不是资讯、知识的传送带。 观点——“实践出真...
- 这8种学生永远拿不到高分!早看早受益! 下面是一位资深班主任总结了8种成绩提不上去的原因,分别对应8类孩子,如果你...