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

資訊專欄INFORMATION COLUMN

手寫實(shí)現(xiàn)promise

skinner / 1498人閱讀

摘要:簡易版本的第一步列出三大塊第二步負(fù)責(zé)注冊所有的函數(shù)負(fù)責(zé)執(zhí)行所有的函數(shù)第三步在里面要加上防止還沒進(jìn)行注冊就直接執(zhí)行了第四步里面要返回這樣就可以鏈?zhǔn)秸{(diào)用了第五步三個(gè)狀態(tài)的管理的鏈?zhǔn)秸{(diào)用在里面一個(gè)這樣才能里面加上異步函數(shù)加上了加入狀態(tài)為了解決在異

// 簡易版本的promise

    // 第一步: 列出三大塊  this.then   resolve/reject   fn(resolve,reject)
    // 第二步: this.then負(fù)責(zé)注冊所有的函數(shù)   resolve/reject負(fù)責(zé)執(zhí)行所有的函數(shù) 
    // 第三步: 在resolve/reject里面要加上setTimeout  防止還沒進(jìn)行then注冊 就直接執(zhí)行resolve了
    // 第四步: resolve/reject里面要返回this  這樣就可以鏈?zhǔn)秸{(diào)用了
    // 第五步: 三個(gè)狀態(tài)的管理 pending fulfilled rejected
 
    // *****promise的鏈?zhǔn)秸{(diào)用 在then里面return一個(gè)promise 這樣才能then里面加上異步函數(shù)
    // 加上了catch
    function PromiseM(fn) {
        var value = null;
        var callbacks = [];
        //加入狀態(tài) 為了解決在Promise異步操作成功之后調(diào)用的then注冊的回調(diào)不會執(zhí)行的問題
        var state = "pending";
        var _this = this;

        //注冊所有的回調(diào)函數(shù)
        this.then = function (fulfilled, rejected) {
            //如果想鏈?zhǔn)絧romise 那就要在這邊return一個(gè)new Promise
            return new PromiseM(function (resolv, rejec) {
                //異常處理
                try {
                    if (state == "pending") {
                        callbacks.push(fulfilled);
                        //實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用
                        return;
                    }
                    if (state == "fulfilled") {
                        var data = fulfilled(value);
                        //為了能讓兩個(gè)promise連接起來
                        resolv(data);
                        return;
                    }
                    if (state == "rejected") {
                        var data = rejected(value);
                        //為了能讓兩個(gè)promise連接起來
                        resolv(data);
                        return;
                    }
                } catch (e) {
                    _this.catch(e);
                }
            });
        }

        //執(zhí)行所有的回調(diào)函數(shù)
        function resolve(valueNew) {
            value = valueNew;
            state = "fulfilled";
            execute();
        }

        //執(zhí)行所有的回調(diào)函數(shù)
        function reject(valueNew) {
            value = valueNew;
            state = "rejected";
            execute();
        }

        function execute() {
            //加入延時(shí)機(jī)制 防止promise里面有同步函數(shù) 導(dǎo)致resolve先執(zhí)行 then還沒注冊上函數(shù)
            setTimeout(function () {
                callbacks.forEach(function (cb) {
                    value = cb(value);
                });
            }, 0);
        }

        this.catch = function (e) {
            console.log(JSON.stringify(e));
        }

        //經(jīng)典 實(shí)現(xiàn)異步回調(diào)
        fn(resolve, reject);
    }

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106706.html

相關(guān)文章

  • 手寫一款符合Promise/A+規(guī)范的Promise

    摘要:手寫一款符合規(guī)范的長篇預(yù)警有點(diǎn)長,可以選擇性觀看。初始狀態(tài)是,狀態(tài)可以有或者不能從轉(zhuǎn)換為或者從轉(zhuǎn)換成即只要由狀態(tài)轉(zhuǎn)換為其他狀態(tài)后,狀態(tài)就不可變更。 手寫一款符合Promise/A+規(guī)范的Promise 長篇預(yù)警!有點(diǎn)長,可以選擇性觀看。如果對Promise源碼不是很清楚,還是推薦從頭看,相信你認(rèn)真從頭看到尾,并且去實(shí)際操作了,肯定會有收獲的。主要是代碼部分有點(diǎn)多,不過好多都是重復(fù)的,不...

    rubyshen 評論0 收藏0
  • 【js】what is Promise手寫實(shí)現(xiàn)簡易版Promise

    摘要:有三種狀態(tài),等待中,已完成,已失敗。對象狀態(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è)用來傳遞異步操作消息的對象。Promise有三種狀態(tài),pending(等待中),resolve...

    LMou 評論0 收藏0
  • 手寫實(shí)現(xiàn)promise

    摘要:簡易版本的第一步列出三大塊第二步負(fù)責(zé)注冊所有的函數(shù)負(fù)責(zé)執(zhí)行所有的函數(shù)第三步在里面要加上防止還沒進(jìn)行注冊就直接執(zhí)行了第四步里面要返回這樣就可以鏈?zhǔn)秸{(diào)用了第五步三個(gè)狀態(tài)的管理的鏈?zhǔn)秸{(diào)用在里面一個(gè)這樣才能里面加上異步函數(shù)加上了加入狀態(tài)為了解決在異 // 簡易版本的promise // 第一步: 列出三大塊 this.then resolve/reject fn(resolv...

    _ang 評論0 收藏0
  • promise/A+規(guī)范翻譯以及手寫實(shí)現(xiàn)

    摘要:如果實(shí)現(xiàn)滿足所有要求,則實(shí)現(xiàn)可能允許。本條款允許使用特定于實(shí)現(xiàn)的方法來采用已知一致承諾的狀態(tài)。接下來根據(jù)規(guī)范進(jìn)行手寫實(shí)現(xiàn)注釋偷懶就將對應(yīng)的規(guī)范標(biāo)注出來,其實(shí)基本上就是對著規(guī)范實(shí)現(xiàn)。 如果要手寫實(shí)現(xiàn)promise,那么先看看promise/A+規(guī)范,再來實(shí)現(xiàn),將會事半功倍。那么我先翻譯一下Promise/A+規(guī)范中的內(nèi)容。 術(shù)語 1.1 promise 是一個(gè)帶有符合此規(guī)范的the...

    LiuZh 評論0 收藏0
  • 「中高級前端面試」JavaScript手寫代碼無敵秘籍

    摘要:第一種直接調(diào)用避免在不必要的情況下使用,是一個(gè)危險(xiǎn)的函數(shù),他執(zhí)行的代碼擁有著執(zhí)行者的權(quán)利。來自于此外,實(shí)現(xiàn)需要考慮實(shí)例化后對原型鏈的影響。函數(shù)柯里化的主要作用和特點(diǎn)就是參數(shù)復(fù)用提前返回和延遲執(zhí)行。手寫路徑導(dǎo)航 實(shí)現(xiàn)一個(gè)new操作符 實(shí)現(xiàn)一個(gè)JSON.stringify 實(shí)現(xiàn)一個(gè)JSON.parse 實(shí)現(xiàn)一個(gè)call或 apply 實(shí)現(xiàn)一個(gè)Function.bind 實(shí)現(xiàn)一個(gè)繼承 實(shí)現(xiàn)一個(gè)J...

    Zhuxy 評論0 收藏0

發(fā)表評論

0條評論

skinner

|高級講師

TA的文章

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