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