JS手寫Promise程式碼ES6方式實現
本篇只簡單實現Promise,不包含鏈式呼叫等。若想詳細瞭解請參考連結,由於Promise實現採用了釋出訂閱模式,所以想要了解原理的可以參考觀察者模式和釋出訂閱模式的區別
程式碼實現
const STATUS = {
PENDING: 'pending',
FULFILLED: 'fulFilled',
REJECTED: 'rejected'
}
class MyPromise {
constructor(executor) {
this.status = STATUS.PENDING // 狀態值
this.value = undefined // 成功返回值
this.reason = undefined // 失敗返回值
this.onFulFilledCallbacks = [] // 成功回撥執行佇列----up
this.onRejectedCallbacks = [] // 失敗回撥執行佇列----up
// 成功
const resolve = (val) => {
// PENDING用來遮蔽的,resolve和reject只能呼叫一個,不能同時呼叫
if (this.status === STATUS.PENDING) {
this.status = STATUS.FULFILLED
this.value = val
this.onFulFilledCallbacks.forEach(fn => fn()) // ----up
}
}
// 是失敗
const reject = (reason) => {
if (this.status === STATUS.PENDING) {
this.status = STATUS.REJECTED
this.reason = reason
this.onRejectedCallbacks.forEach(fn => fn()) // ----up
}
}
try {
executor(resolve, reject)
} catch (e) {
reject(e)
}
}
then(onFullFilled, onRejected) {
// 同步呼叫判斷
if (this.status === STATUS.FULFILLED) {
onFullFilled(this.value)
}
if (this.status === STATUS.REJECTED) {
onRejected(this.reason)
}
// 非同步呼叫判斷 ----up
if (this.status === STATUS.PENDING) {
this.onFulFilledCallbacks.push(() => {
onFullFilled(this.value)
})
this.onRejectedCallbacks.push(() => {
onRejected(this.reason)
})
}
}
}
// const p = new MyPromise((resolve, reject) => {
// // resolve('success') // 走了成功就不會走失敗了
// // throw new Error('失敗') // 失敗了就走resolve
// // reject('failed') // 走了失敗就不會走成功
// resolve('成功!')
// })
// p.then((res) => {
// console.log(res)
// }, (err) => {
// console.log(err)
// })
const p = new MyPromise((resolve, reject) => {
setTimeout(function() {
resolve('success')
}, 1000)
})
p.then((res) => {
console.log(res)
}, (err) => {
console.log(err)
})
相關文章
- 用原生js手寫實現promiseJSPromise
- 幾道JS程式碼手寫題以及一些程式碼實現JS
- Promise 程式碼實現Promise
- Es6 Promise 實現Promise
- js手寫程式碼合集JS
- 手寫實現滿足 Promise/A+ 規範的 PromisePromise
- 可能這裡有你想要的js手寫程式碼實現JS
- JS面試手寫程式碼JS面試
- JS 筆試手寫程式碼JS筆試
- ES6 Promise 及實現原理Promise
- 手動實現一個promise(原始碼)Promise原始碼
- 一步一步實現手寫PromisePromise
- 看promise教你如何優雅的寫js非同步程式碼PromiseJS非同步
- 手寫PromisePromise
- 手寫 PromisePromise
- 手寫演算法-python程式碼實現Kmeans演算法Python
- 網站返回頂部jquery js實現程式碼方式案例網站jQueryJS
- JS手寫狀態管理的實現JS
- [手寫系列] 帶你實現一個簡單的PromisePromise
- Promise規範以及手寫PromisePromise
- Promise原始碼實現Promise原始碼
- 手寫一個Promise,附原始碼分析Promise原始碼
- 在linux系統中,手動編寫java程式碼,將介面打成jar供其他程式呼叫,實現方式LinuxJavaJAR
- js 真的是一步一步手寫promiseJSPromise
- 來,用ES6寫個Promise吧Promise
- 小程式實現手寫簽名
- js 實現程式碼雨效果JS
- promise專題--手寫promise03Promise
- 手寫簡易PromisePromise
- 自己動手寫PromisePromise
- 手寫一個PromisePromise
- 嘗試手寫promisePromise
- 實操ES6之PromisePromise
- 從零手寫逐步實現Promise A+標準的所有方法Promise
- 用es5實現es6的promise,徹底搞懂promise的原理Promise
- 基於promise /A+規範手寫promisePromise
- 手寫Koa.js原始碼JS原始碼
- 手寫Express.js原始碼ExpressJS原始碼