摘要:最近面試有問到的原理,以及實(shí)現(xiàn)的方法。所以自己動(dòng)手實(shí)現(xiàn)了一個(gè),發(fā)個(gè)文章記錄下。簡單分析下,實(shí)例對(duì)象有兩個(gè)屬性,一個(gè)是,一個(gè)是。
最近面試有問到Promise的原理,以及實(shí)現(xiàn)的方法。所以自己動(dòng)手實(shí)現(xiàn)了一個(gè),發(fā)個(gè)文章記錄下。
簡單分析下,promise實(shí)例對(duì)象有兩個(gè)屬性,一個(gè)是status,一個(gè)是value。還有一個(gè)then方法。
status有3個(gè)狀態(tài),pending,resolved,rejected。value就是then回調(diào)的時(shí)候傳的值。
下面是代碼
/* 原生js模擬promise */ const PromisePolyfill = (() => { //狀態(tài)管理 const promiseStatusSymbol = Symbol("PromiseStatus"); const promiseValueSymbol = Symbol("PromiseValue"); const STATUS = { PENDING: "PENDING", FULFILLED: "FULFILLED", REJECTED: "REJECTED" }; //resolve操作設(shè)置值和狀態(tài) function resolve() { this[promiseValueSymbol] = arguments[0]; this[promiseStatusSymbol] = STATUS["FULFILLED"]; } //reject操作設(shè)置值和狀態(tài) function reject() { this[promiseValueSymbol] = arguments[0]; this[promiseStatusSymbol] = STATUS["REJECTED"]; } class myPromise { constructor(resolver) { if (typeof resolver !== "function") { throw new TypeError(`parameter 1 must be a function, but get a ${typeof func}`); } this[promiseStatusSymbol] = STATUS["PENDING"];//初始狀態(tài)為pending resolver( resolve.bind(this),//綁定promise實(shí)例對(duì)象 reject.bind(this) ); } then(callback) { //開一個(gè)定時(shí)器監(jiān)聽狀態(tài)變化,如果有變化則執(zhí)行callback const interval = setInterval(() => { if (this[promiseStatusSymbol] === "FULFILLED" || this[promiseStatusSymbol] === "REJECTED") { clearInterval(interval); callback(this[promiseValueSymbol], resolve.bind(this), reject.bind(this)); this[promiseStatusSymbol] = "PENDING";//執(zhí)行完后把狀態(tài)改回,方便下一個(gè)then方法進(jìn)行定時(shí)輪詢 } }); return this; } } return myPromise; })();
寫完了丟到控制臺(tái)測(cè)試,完美預(yù)期運(yùn)行
//測(cè)試,下面會(huì)先打印出111,再打印出222,333 new PromisePolyfill(function (resolve, reject) { setTimeout(() => { resolve(222); console.log(111) }, 1000); }).then(function (res, resolve, reject) { setTimeout(() => { resolve(333); console.log(res) }, 3000); }).then(function (res, resolve, reject) { console.log(res); });
代碼github地址:https://github.com/leeseean/P...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93277.html
前言 作為一個(gè)后端過來的同學(xué),剛?cè)腴T前端的時(shí)候,被js種種「反人類」的概念折騰的死去活來的.其中一個(gè)印象比較深刻的,就是promise,感覺實(shí)在太難理解了...所有就有了寫個(gè)簡單的promise的想法.希望能幫助到一些跟我一樣,感覺promise很難理解的新同學(xué). promise的教程網(wǎng)上多如牛毛,其中寫的比較通俗易懂的莫過于阮一峰的es6,反正我是他的書才懂的.所以今天,我們也不會(huì)來復(fù)述一遍如何...
摘要:簡要說明長處在于使用模塊規(guī)范,而不是使用的模塊規(guī)范,以及使用的模塊規(guī)范。簡單使用關(guān)于命令行工具使用,請(qǐng)參照官方文檔。相同模塊重復(fù)依賴模塊重復(fù)依賴很容易理解,模塊實(shí)現(xiàn)時(shí)可能分割為多個(gè)子文件實(shí)現(xiàn),每個(gè)子文件內(nèi)部可能會(huì)引用同一個(gè)模塊,如。 簡介 browerify: http://browserify.org/index.html browserify可以看做瀏覽器端的又一個(gè)模塊...
摘要:有三種狀態(tài),等待中,已完成,已失敗。對(duì)象狀態(tài)不受外界影響,只有異步操作的結(jié)果可以改變狀態(tài),這就是的由來怎么用接受一個(gè)函數(shù)作為參數(shù),這個(gè)參數(shù)函數(shù)的兩個(gè)參數(shù)分別是和,用來執(zhí)行了兩種狀態(tài)的回調(diào)函數(shù)。當(dāng)實(shí)例生成后,用方法來指定兩種狀態(tài)的回調(diào)函數(shù)。 什么是Promise 官方的解釋:Promise是一個(gè)用來傳遞異步操作消息的對(duì)象。Promise有三種狀態(tài),pending(等待中),resolve...
摘要:也就是說,我的篇文章的請(qǐng)求對(duì)應(yīng)個(gè)實(shí)例,這些實(shí)例都請(qǐng)求完畢后,執(zhí)行以下邏輯他的目的在于對(duì)每一個(gè)返回值這個(gè)返回值為單篇文章的內(nèi)容,進(jìn)行方法處理。 英國人Robert Pitt曾在Github上公布了他的爬蟲腳本,導(dǎo)致任何人都可以容易地取得Google Plus的大量公開用戶的ID信息。至今大概有2億2千5百萬用戶ID遭曝光。 亮點(diǎn)在于,這是個(gè)nodejs腳本,非常短,包括注釋只有71行。 ...
摘要:工具軟件欲先攻其事必先利其器,用好工具是做好開發(fā)的基礎(chǔ)??蚣苣壳白盍餍泻唵我子茫絹碓蕉嗳擞迷?jīng)很流行,現(xiàn)在有點(diǎn)衰退狀態(tài)管理后端渲染開發(fā)工具依賴管理,應(yīng)用打包,任務(wù)管理,編輯器擴(kuò)展,,移動(dòng)端有了前端的知識(shí)后,我們還可以開發(fā)手機(jī)。 2019年即將到來,各位同學(xué)2018年辛苦了。 不管大家2018年過的怎么樣,2019年還是要繼續(xù)加油的! 在此我整理了個(gè)人認(rèn)為在2019仍是或者將成為主流的...
閱讀 3015·2021-11-24 10:22
閱讀 3061·2021-11-23 10:10
閱讀 1371·2021-09-28 09:35
閱讀 1763·2019-08-29 13:16
閱讀 1405·2019-08-26 13:29
閱讀 2801·2019-08-26 10:27
閱讀 692·2019-08-26 10:09
閱讀 1456·2019-08-23 18:05