手动实现Promise
生活随笔
收集整理的這篇文章主要介紹了
手动实现Promise
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
基本原理
今天心血來潮,哈哈,就想寫個(gè)promise對(duì)象,需要說的是,我沒有參考誰的代碼,也沒有去看promise的源碼,當(dāng)然,我實(shí)現(xiàn)的是一個(gè)乞丐版的promise,只有then & catch 的功能,其中catch只能抓取一次。僅供大伙閑暇看看,打發(fā)下時(shí)間。代碼注釋簡單說了下,如下:
import _ from 'lodash'var compose = _.flowRightclass Xpromise {constructor(f) {this._value = f.bind(undefined, this.resolve, this.reject) // 為傳入的 函數(shù) 綁定resolve & reject 方法this.chain = undefined // 把then傳入的方法 通過compose 處理成鏈?zhǔn)秸{(diào)用this.errFunc = [] // 把catch 傳入的方法setTimeout( () => { // 如果new 一個(gè)新的對(duì)象,傳入的函數(shù)不是異步的,則chain & errFunc 拿不到就執(zhí)行了。所以使用定時(shí)器延時(shí)執(zhí)行。this.errHandle(this._value)()}, 0)this.status = 'pending' // 設(shè)置Xpromise 狀態(tài) 主要作用是 確保resolve & reject只能執(zhí)行其中一個(gè)return this}resolve = (data) => {if(this.status == 'pending')this.status = 'resolved'this.status == 'resolved' && this.chain && this.chain(data)}reject = (data) => {if(this.status == 'pending')this.status = 'rejected'this.status = 'rejected' && this.errFunc[0](data)}then = (f) => {this.chain = this.chain? compose(this.errHandle(f), this.chain): this.errHandle(f)return this}errHandle = (f) => {// 為每個(gè)傳入的函數(shù)包裹 錯(cuò)誤檢查 代碼return function() {var args = Array.prototype.slice.call(arguments, 0)try{return f.apply(f,args)}catch(e){if(this.errFunc.length !== 0)this.errFunc[0](e)elsethrow new Error(e)return}}}catch = (f) => {this.errFunc.push(f)return this} }總結(jié)
以上是生活随笔為你收集整理的手动实现Promise的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序开发遇到的那些“坑”(1.2.
- 下一篇: SSM框架下实现导入功能