欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Promise的實現(xiàn)思路是什么

這篇文章給大家分享的是有關(guān)Promise的實現(xiàn)思路是什么的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

廈門網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

Promise實現(xiàn)思路的個人理解

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

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

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

用例

   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'
            } )

我覺得實現(xiàn)一個函數(shù)跟封裝組件類似,首先從以下幾點考慮:

  • 1.這個函數(shù)用來做什么的?

  • 2.接受哪些參數(shù)

  • 3.返回值是什么

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

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

  • 2.構(gòu)造函數(shù)Promise接受一個函數(shù)。函數(shù)的參數(shù)是resolve,reject,resolve和reject也是函數(shù),是給用戶調(diào)用用的,當(dāng)用戶希望下一個異步執(zhí)行時,就調(diào)用resolve(0

  • 3.返回一個promise實例。promise實例都有一個then方法,而then方法也返回一個新的promise實例。由此就可以鏈?zhǔn)秸{(diào)用then了

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

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

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

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

        class Promise2 {
            constructor( fn ) {
                this.successFnArray = []  // 用來緩存successFn和errorFn
                this.errorFnArray = []
                this.state = 'pendding'
                const resolve = ( res ) => {      // resolve就做2件事情  1: 修改狀態(tài) 2:調(diào)用successFn
                    this.state = 'fulfilled'
                    this.value = res         // this.value用來緩存data數(shù)據(jù)或者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 )   // 先調(diào)用fn再說
            }

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

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

        } )

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

實現(xiàn)then鏈?zhǔn)秸{(diào)用

then的實現(xiàn),和JQ的鏈?zhǔn)秸{(diào)用不同,JQ是每次調(diào)用方法后,把this返回

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

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

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

之前的then做了哪些事情?

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

鏈?zhǔn)絫hen有哪些改動?

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

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

而是調(diào)用_successFn,而這個函數(shù)內(nèi)部本質(zhì)上還是調(diào)用successFn(),但同時把調(diào)用的返回值作為了resolve的參數(shù),調(diào)用了resolve()

因為當(dāng)successFn被調(diào)用,得到返回值時,就表示這個函數(shù)執(zhí)行完了,

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

       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 )
                    }
                } )

            }

感謝各位的閱讀!關(guān)于Promise的實現(xiàn)思路是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網(wǎng)站題目:Promise的實現(xiàn)思路是什么
網(wǎng)址分享:http://aaarwkj.com/article30/gojppo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化標(biāo)簽優(yōu)化、企業(yè)建站、網(wǎng)站導(dǎo)航、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
91在线免费观看日本| 国产精品粗又长一区| 久久精品视频亚洲一级| 91精品国产高清一区二区性色| 国产又黄又爽不卡的视频| 日韩成人中文字幕电影| 国产精品成久久久久三级| 亚洲另类熟女国产精品老| 打开网址国语一级黄色片| 国产一区二区三区在线看片| 亚洲国产熟女一区二区三| 自偷自拍在线免费观看| 欧美夫妻香蕉视频网站| 国产剧情av一区在线观看| 久久精品成人无码观看56| 一卡二卡精品在线免费| 国产成人大片中文字幕在线| 亚洲日本在线观看午夜视频| 人妻一区二区三区久久| 午夜在线成人免费观看| 国产白丝免费在线观看| 日本亚洲一区二区在线观看| 日韩传媒在线观看视频| 女优一区二区三区蜜桃| 久久伊人亚洲精品中文字幕| 日韩人妻中文字幕专区| 亚洲久久精品一区二区| 神马久久午夜免费福利| 国产农村熟妇av国语对白| 国产av自拍在线免费观看| 综合激情网激情五月天| 欧美国产日韩在线一区二区三区| 成人久久精品一区二区| 国产丝袜美腿视频亚洲综合| 国产青草视频免观看视频| 麻豆资源视频在线观看| 91精品国产欧美在线| 丰满人妻中出av在线| 日韩精品一区二区三区中文| 精品国产一区二区三区精品日韩| 成年人免费在线不卡视频|