在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

Promise完成思路的深入區分(代碼示例)

Promise完成思路的深入區分(代碼示例)

更新時間:2025-12-08 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于Promise實現思路的深入分析(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

Promise實現思路的個人理解

我一直覺得Promise雖然方便,但是它的寫法很怪,無法理解實現Promise的人是如何思考的。

不過最近我對于實現Promise的思考過程的有了一點點個人理解,特此記下。

感覺這篇文章我還是沒有把思路說清楚,時間緊張,就當做一次記錄,回頭我要把這個過程在表達的在清楚一點。

用例

   var p1 = new Promise2( ( resolve, reject ) => {
            setTimeout( () => {
                resolve( 'hello' )
            }, 1000 )

        } )

        p1.then( res => {
                console.log( res + 'world' )
                return res + 'world'
            } )
            .then( res => {
                console.log( res + 'ziwei' )
                return res + 'ziwei'
            } )

我覺得實現一個函數跟封裝組件類似,首先從以下幾點考慮:

  • 1.這個函數用來做什么的?

  • 2.接受哪些參數

  • 3.返回值是什么

那么結合例子,和這幾個問題,我們得到

  • 1.Promise是做異步流程控制的。通俗說就是,我希望某個函數暫時不執行,等我希望它執行時,就resolve一下,你這個函數在執行。

  • 2.構造函數Promise接受一個函數。函數的參數是resolve,reject,resolve和reject也是函數,是給用戶調用用的,當用戶希望下一個異步執行時,就調用resolve(0

  • 3.返回一個promise實例。 promise實例都有一個then方法,而then方法也返回一個新的promise實例。由此就可以鏈式調用then了

先實現一個Promise(未實現then的鏈式調用)
  • 1.Promise接受一個fn,不管其他,你覺得這個fn在內部會干嘛?只能被調用唄,所以雖然不知道怎么搞,但是先調用一下fn(resolve,reject)

  • 2.那這個resolve和reject不是用戶實現的,所以肯定是Promise開發者實現的,那我們要實現resolve和reject,它們是干嘛的,肯定用來是改變狀態的,所以定義this.state

  • 3.resolve和reject也會接受用戶的參數吧,那我們就需要把這個參數用this.value緩存一下,將來then方法調用時,需要傳遞進去

  • 4.then接受successFn和errorFn,這2個就是我們希望暫時不執行的函數了。怎么做到暫時不執行呢?就是聲明2個數組,把他們先存起來,將來resolve時,在調用

        class Promise2 {
            constructor( fn ) {
                this.successFnArray = []  // 用來緩存successFn和errorFn
                this.errorFnArray = []
                this.state = 'pendding'
                const resolve = ( res ) => {      // resolve就做2件事情  1: 修改狀態 2:調用successFn
                    this.state = 'fulfilled'
                    this.value = res         // this.value用來緩存data數據或者error

                    this.successFnArray.forEach( successFn => {
                        successFn( res )
                    } )
                }
                const reject = ( err ) => {
                    this.state = 'rejected'
                    this.value = err

                    this.errorFnArray.forEach( errorFn => {
                        errorFn( res )
                    } )
                }
                fn( resolve, reject )   // 先調用fn再說
            }

            then( successFn, errorFn ) {
                switch ( this.state ) {
                    case 'fulfilled':
                        successFn( this.value )        // 如果調用了resolve,狀態就成了fulfilled,就會執行successFn
                        break
                    case 'rejected':
                        errorFn( this.value )
                        break
                    case 'pendding':
                        this.successFnArray.push( successFn )   // 如果還沒調用resolve,狀態就是pendding,就先把這些異步函數緩存起來。將來resole時調用
                        this.errorFnArray.push( errorFn )
                }
            }
        }

        var p1 = new Promise2( ( resolve, reject ) => {
            setTimeout( () => {
                resolve( 'hello' )
            }, 1000 )

        } )

        p1.then( res => {
            console.log( res + 'world' )
            return res + 'world'
        } )

實現then鏈式調用

then的實現,和JQ的鏈式調用不同,JQ是每次調用方法后,把this返回

而Promise規范要求,每次都要返回新的Promise對象

所以只需要把then方法修改一下。

這部分可能會迷惑,但是我想先說一下這里做了哪些事情,其實變化不大

之前的then做了哪些事情?

  • 就是按照不同的state,調用了successFn或者errorFn,如果是pendding狀態就先緩存起來,等將來resolve時調用

鏈式then有哪些改動?

  • 首先then有了返回值,返回一個promise,而之前沒有返回值,return的是undefined

  • new Promise的過程,其實邏輯沒什么變化,唯一注意的,比如狀態fulfilled時,并非直接調用successFn

而是調用_successFn,而這個函數內部本質上還是調用successFn(),但同時把調用的返回值作為了resolve的參數,調用了resolve()

因為當successFn被調用,得到返回值時,就表示這個函數執行完了,

就需要執行下一個異步函數了,這樣下一個異步函數也會把successFn(res)的return值作為參數

       then( successFn, errorFn ) {
                
                return new Promise2( ( resolve, reject ) => {
                    const _successFn = res => {
                        resolve(successFn(res))
                    }
                    const _errorFn = err => {
                        reject(errorFn(err))
                    }
                    
                    switch ( this.state ) {
                        case 'fulfilled':
                        _successFn( this.value )
                            break
                        case 'rejected':
                        _errorFn( this.value )
                            break
                        case 'pendding':
                            this.successFnArray.push( _successFn )
                            this.errorFnArray.push( _errorFn )
                    }
                } )

            }

以上就是Promise實現思路的深入分析(代碼示例)的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 亚洲精品在线网址| 夜夜爽久久精品91| 成人黄色片视频| 国产a级片免费观看| 97在线播放视频| 天天色综合天天色| 日韩不卡的av| 欧美久久久久久久久久久久久久| 国产毛片久久久久久国产毛片| 91午夜在线观看| 啊啊啊一区二区| a在线观看免费视频| 国产精品久久久久久久99| 91 视频免费观看| 精品人妻人人做人人爽| 凹凸国产熟女精品视频| 狠狠操狠狠干视频| 黄色一级片国产| aaa毛片在线观看| 五月天开心婷婷| 国产二区视频在线| 国产aaaaa毛片| 欧美黄色免费网址| 国语对白做受xxxxx在线中国| 九一精品久久久| 俄罗斯av网站| 一区二区三区国产好的精华液| www插插插无码视频网站| 另类小说色综合| 欧美a级免费视频| 国产精品久久久毛片| 和岳每晚弄的高潮嗷嗷叫视频| 亚洲中文字幕久久精品无码喷水| 99精品一区二区三区的区别| 北条麻妃视频在线| 成年人视频网站免费| 777视频在线| 国内性生活视频| 干日本少妇视频| 91精品无人成人www| 欧美视频在线播放一区| 亚洲区成人777777精品| 在线观看日本一区二区| av网站在线观看不卡| 特大黑人娇小亚洲女mp4| 一级片视频免费观看| www.中文字幕在线| 国产夫妻自拍一区| 欧美h视频在线观看| 在线观看岛国av| 五月婷婷狠狠操| 男女曰b免费视频| www精品久久| 久久99久久久久久| 日韩a级黄色片| 伊人网在线免费| 国产树林野战在线播放| 亚洲黄色av片| www.com久久久| www.涩涩涩| 天天影视色综合| 日本中文字幕二区| 日本高清一区二区视频| 亚洲综合婷婷久久| 三级av免费观看| 中文字幕第一页在线视频| 亚洲xxx在线观看| 性生生活大片免费看视频| 中文字幕av专区| 中文字幕一区二区三区四| а 天堂 在线| 日本国产中文字幕| 阿v天堂2018| 国产精品秘入口18禁麻豆免会员 | 福利片一区二区三区| 一区二区三区视频网| 色婷婷一区二区三区av免费看| 亚洲免费999| 国产日韩欧美大片| 全黄性性激高免费视频| 美女av免费在线观看| 国产成人精品视频ⅴa片软件竹菊| 日韩a在线播放| 久久久久国产一区| 老汉色影院首页| 黄色成人在线看| mm1313亚洲国产精品无码试看| 精品亚洲一区二区三区四区| 日韩av加勒比| a在线视频观看| mm131国产精品| 美女av免费观看| 免费激情视频在线观看| 国产精品久久久久久9999| www.欧美黄色| 69久久久久久| 性一交一乱一伧国产女士spa| www.日日操| 玖玖精品在线视频| 欧美日韩黄色一级片| 成人av毛片在线观看| 国产精品无码人妻一区二区在线| wwwwww.色| 亚洲精品蜜桃久久久久久| 美女黄色片视频| 免费看黄在线看| 91在线第一页| 白嫩少妇丰满一区二区| 国产精品无码电影在线观看| 日本免费观看网站| 人妻av中文系列| 天天操精品视频| 黄色成人免费看| 日韩中文字幕在线视频观看| 黄色一级视频播放| 三上悠亚在线一区二区| 免费一级特黄特色毛片久久看| 天堂av手机在线| 欧美aⅴ在线观看| 波多野结衣av一区二区全免费观看| 午夜视频在线瓜伦| 日日橹狠狠爱欧美超碰| av动漫在线播放| 欧美h视频在线观看| 九九热免费精品视频| 国产二级片在线观看| 毛片av在线播放| 欧美国产在线一区| 图片区乱熟图片区亚洲| 91国产精品视频在线观看| 成人一级片网站| 国产极品尤物在线| 免费人成自慰网站| 精品无码av无码免费专区| 亚洲综合20p| 三日本三级少妇三级99| 一个色综合久久| 老司机久久精品| 中文字幕第一页在线视频| 亚洲黄色av片| 午夜免费一级片| 国产一二三四五| 日韩不卡视频一区二区| 三级在线免费观看| 97超碰国产精品| 欧美一区二区激情| 尤物av无码色av无码| 男人操女人逼免费视频| 黄色片视频在线免费观看| 国产av无码专区亚洲精品| 久久精品视频91| 黄大色黄女片18第一次| 成人免费黄色av| 国内少妇毛片视频| 黄色一级一级片| www.se五月| 国产精品8888| 久久久一本二本三本| 国产淫片av片久久久久久| 波多野结衣天堂| 自拍偷拍视频在线| www.99热这里只有精品| 国产精品无码一本二本三本色| 奇米影视四色在线| 日本中文字幕在线不卡| 成人免费网站入口| 爱情岛论坛成人| 做爰高潮hd色即是空| 国产妇女馒头高清泬20p多| 国产成人无码一二三区视频| 中文字幕66页| 欧美亚洲日本一区二区三区| 999精品视频在线| 97在线免费视频观看| 激情婷婷综合网| 成人av在线播放观看| 男女曰b免费视频| 国产激情片在线观看| 少妇性l交大片| 欧美美女黄色网| 国产一级做a爰片久久| 800av在线免费观看| 国产情侣av自拍| av在线播放天堂| 视频区 图片区 小说区| 播放灌醉水嫩大学生国内精品| 手机在线免费毛片| chinese少妇国语对白| 真人抽搐一进一出视频| 日韩高清第一页| 黑森林福利视频导航| www成人免费| 亚洲精品免费一区亚洲精品免费精品一区 | 中文字幕第100页| 国产老熟妇精品观看| 91社在线播放| 日本一二区免费| 欧美 国产 小说 另类| 国产乱淫av片杨贵妃| 日日噜噜夜夜狠狠久久丁香五月|