91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Promise的實現思路是什么

發布時間:2020-10-19 14:29:24 來源:億速云 閱讀:159 作者:小新 欄目: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的實現思路是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

封开县| 枣强县| 富民县| 西丰县| 徐州市| 昔阳县| 游戏| 福清市| 安多县| 壶关县| 甘孜县| 开鲁县| 焦作市| 沭阳县| 衡阳市| 自治县| 灌南县| 永寿县| 平塘县| 泸定县| 万源市| 昌都县| 越西县| 镇平县| 莆田市| 甘南县| 紫云| 称多县| 双流县| 秭归县| 浮梁县| 阿尔山市| 托克托县| 陆良县| 宁陵县| 观塘区| 滨州市| 家居| 新郑市| 通州市| 盐边县|