成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

40行js實(shí)現(xiàn)一個(gè)簡易Promise

nihao / 517人閱讀

摘要:最近面試有問到的原理,以及實(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

相關(guān)文章

  • 3代碼實(shí)現(xiàn)一個(gè)簡易promise

    前言 作為一個(gè)后端過來的同學(xué),剛?cè)腴T前端的時(shí)候,被js種種「反人類」的概念折騰的死去活來的.其中一個(gè)印象比較深刻的,就是promise,感覺實(shí)在太難理解了...所有就有了寫個(gè)簡單的promise的想法.希望能幫助到一些跟我一樣,感覺promise很難理解的新同學(xué). promise的教程網(wǎng)上多如牛毛,其中寫的比較通俗易懂的莫過于阮一峰的es6,反正我是他的書才懂的.所以今天,我們也不會(huì)來復(fù)述一遍如何...

    ralap 評(píng)論0 收藏0
  • Browserify簡易入坑指南

    摘要:簡要說明長處在于使用模塊規(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è)模塊...

    vpants 評(píng)論0 收藏0
  • js】what is Promise和手寫實(shí)現(xiàn)簡易Promise

    摘要:有三種狀態(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...

    LMou 評(píng)論0 收藏0
  • nodeJS實(shí)現(xiàn)基于Promise爬蟲 定時(shí)發(fā)送信息到指定郵件

    摘要:也就是說,我的篇文章的請(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行。 ...

    xuweijian 評(píng)論0 收藏0
  • 2019 簡易Web開發(fā)指南

    摘要:工具軟件欲先攻其事必先利其器,用好工具是做好開發(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仍是或者將成為主流的...

    vspiders 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<