电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JS手寫一個自定義Promise操作示例

瀏覽:123日期:2024-05-17 10:27:17

本文實例講述了JS手寫一個自定義Promise操作。分享給大家供大家參考,具體如下:

經(jīng)常在面試題中會看到,讓你實現(xiàn)一個Promsie,或者問你實現(xiàn)Promise的原理,所以今天就嘗試利用class類的形式來實現(xiàn)一個Promise

為了不與原生的Promise命名沖突,這里就簡單命名為MyPromise.

class MyPromise { constructor(executor) { let _this = this this.state = ’pending’ // 當前狀態(tài) this.value = undefined // 存儲成功的值 this.reason = undefined // 存儲失敗的值 // 利用發(fā)布訂閱模式,讓Promise支持異步 this.onFulfilledFunc = [] // 存儲成功的回調(diào) this.onRejectedFunc = [] // 存儲失敗的回調(diào) function resolve (value) { // Promise對象已經(jīng)由pending狀態(tài)改變?yōu)榱顺晒B(tài)(resolved)或是失敗態(tài)(rejected)就不能再次更改狀態(tài)了。因此我們在更新狀態(tài)時要判斷,如果當前狀態(tài)是pending(等待態(tài))才可更新 if (_this.state === ’pending’) { _this.value = value //依次執(zhí)行成功回調(diào) _this.onFulfilledFunc.forEach(fn => fn(value)) _this.state = ’resolved’ } } function reject (reason) { // Promise對象已經(jīng)由pending狀態(tài)改變?yōu)榱顺晒B(tài)(resolved)或是失敗態(tài)(rejected)就不能再次更改狀態(tài)了。因此我們在更新狀態(tài)時要判斷,如果當前狀態(tài)是pending(等待態(tài))才可更新 if (_this.state === ’pending’) { _this.reason = reason //依次執(zhí)行失敗回調(diào) _this.onRejectedFunc.forEach(fn => fn(reason)) _this.state = ’rejected’ } } try { // 當實例化Promise時,構造函數(shù)中就要馬上調(diào)用傳入的executor函數(shù)執(zhí)行 executor(resolve, reject) } catch (error) { reject(error) } } _resolvePromise (promise2, x, resolve, reject) { // 如果返回了自己的Promise對象,狀態(tài)永遠為等待態(tài)(pending),再也無法成為resolved或是rejected,程序會死掉,因此首先要處理它 if (promise2 === x) { reject(new TypeError(’Promise存在循環(huán)引用’)) } if (x !== null && (typeof x === ’object’ || typeof x === ’function’)) { // x可能是一個promise try { let then = x.then if (typeof then === ’function’) { then.call(x, (y) => { _resolvePromise(promise2, y, resolve, reject) }) } else { resolve(x) } } catch (err) { reject(err) } } else { //否則是個普通值 resolve(x) } } then (onFulfilled, onRejected) { let promise2 onFulfilled = typeof onFulfilled === ’function’ ? onFulfilled : function (val) { return val } onRejected = typeof onRejected === ’function’ ? onRejected : function (reason) { throw reason } if (this.state === ’resolved’) { promise2 = new MyPromise((resolve, reject) => { setTimeout(() => { try { let x = onFulfilled(this.value) this._resolvePromise(promise2, x, resolve, reject) } catch (error) { reject(error) } }, 0); }) } if (this.state === ’rejected’) { promise2 = new MyPromise((resolve, reject) => { setTimeout(() => { try { let x = onRejected(this.reason) this._resolvePromise(promise2, x, resolve, reject) } catch (error) { reject(error) } }, 0); }) } if (this.state === ’pending’) { promise2 = new MyPromise((resolve, reject) => { this.onFulfilledFunc.push(() => { setTimeout(() => { try { let x = onFulfilled(this.value) this._resolvePromise(promise2, x, resolve, reject) } catch (error) { reject(error) } }, 0); }) this.onRejectedFunc.push(() => { setTimeout(() => { try { let x = onRejected(this.reason) this._resolvePromise(promise2, x, resolve, reject) } catch (error) { reject(error) } }, 0); }) }) } return promise2 }}

運行測試:

var promise = new MyPromise((resolve, reject) => { console.log(1) setTimeout(() => { resolve(2) }, 1000); console.log(3)}).then(value => console.log(value))

結果真香:

JS手寫一個自定義Promise操作示例

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內(nèi)容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調(diào)試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數(shù)學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 自动钻孔机-全自动数控钻孔机生产厂家-多米(广东)智能装备有限公司 | SDI车窗夹力测试仪-KEMKRAFT方向盘测试仪-上海爱泽工业设备有限公司 | 定制异形重型钢格栅板/钢格板_定做踏步板/排水沟盖板_钢格栅板批发厂家-河北圣墨金属制品有限公司 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | 电动葫芦-河北悍象起重机械有限公司 | 环比机械 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 湖南自考_湖南自学考试网| 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 煤棒机_增碳剂颗粒机_活性炭颗粒机_木炭粉成型机-巩义市老城振华机械厂 | 细沙回收机-尾矿干排脱水筛设备-泥石分离机-建筑垃圾分拣机厂家-青州冠诚重工机械有限公司 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 成都亚克力制品,PVC板,双色板雕刻加工,亚克力门牌,亚克力标牌,水晶字雕刻制作-零贰捌广告 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 四川成都干燥设备_回转筒干燥机_脉冲除尘器_输送设备_热风炉_成都川工星科机电设备有限公司 | 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 厂厂乐-汇聚海量采购信息的B2B微营销平台-厂厂乐官网 | 北京网络营销推广_百度SEO搜索引擎优化公司_网站排名优化_谷歌SEO - 北京卓立海创信息技术有限公司 | 天助网 - 中小企业全网推广平台_生态整合营销知名服务商_天助网采购优选 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 底部填充胶_电子封装胶_芯片封装胶_芯片底部填充胶厂家-东莞汉思新材料 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 仓储笼_金属箱租赁_循环包装_铁网箱_蝴蝶笼租赁_酷龙仓储笼租赁 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 辊道窑炉,辊道窑炉厂家-山东艾希尔 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 天津电机维修|水泵维修-天津晟佳机电设备有限公司 | 上海风淋室_上海风淋室厂家_上海风淋室价格_上海伯淋 |