Promise運用細節

Promise運用細節

運用promise須要注重的幾點:

1.怎樣用promise完成并行的異步 (Promise.all合營.map)

  • Promise.all()參數 : 一個許多promise構成的數組
  • Promise.all()返回值 : 當一切異步都實行完后,promise.all的狀況才變成fulfilled,返回一個各個效果構成的數組
       var arr = []
        for ( let i = 0; i < 5; i++ ) {
            arr.push( new Promise( ( resolve ) => {
                setTimeout( () => {
                    console.log( i )
                    resolve('效果:' + i)
                }, i * 1000 )
            } ) )
        }

        
        Promise.all(arr).then(val => {
            console.log(val)
        })

2.用Promise串行的異步

  • then的鏈式挪用
  • 合營forEach或許reduce

3.Promise.race的用法

Promise.race()和all相似,也能夠并行,然則它是只需有一個子promise完成了,race()的狀況也就完成了。

運用: 把一個異步操作和定時器放在一同。假如定時器先觸發就提醒用戶超時

        let ajaxData = ''
        const ajax = new Promise( ( resolve ) => {
            setTimeout( () => {
                console.log( 'ajax' )
                ajaxData = 'ajax'
                resolve()
            }, 3000 )
        } )

        const timer = new Promise( ( resolve ) => {
            setTimeout( () => {
                if(ajaxData== ''){
                    console.log( '用戶超時' )
                }else{

                }
                
                resolve()
            }, 2000 )
        } )
        Promise.race( [ timer, ajax ] ).then( (data) => {
            console.log(data)
        } )

4.什麼是值穿透?

.then或許.catch希冀傳入一個函數,假如不是函數,會發作值穿透

      Promise.resolve(1)
            .then(2)
            .then(3)
            .then(val => {
                console.log(val)
            })

5.catch和then的第二個參數的區分?

  • 比較相似,catch是一個語法糖,相當於then(null,() => {})
  • 另有一點區分就是,假如第一個then報錯,第二個then沒法捕捉。catch能夠

6.假如catch或許then的第二個參數也拋出非常了,該怎樣處置懲罰?

經由過程全局增加一個unhandledrejection捕捉Promise非常

window.addEventListener("unhandledrejection", (e) =>{
    console.log(e.reason)
})    

let promise = new Promise((resolve, reject) => {
    reject('Hello World')
});

promise.catch((err) => {
    throw('Unexpected Error');     // Unexpected Error
})

7.為何then返回的都是Promise對象?

  • then假如你return的不是promise對象,自動用Promise.resolve包裝一下
  • then的鏈式挪用,並非經由過程return this,而是經由過程每次製造一個新的promise實例

8.一道關於Promise運用的面試題 :紅燈三秒亮一次,綠燈一秒亮一次,黃燈2秒亮一次;怎樣讓三個燈不停交替反覆亮燈?(用Promse完成)

        function tip( timer, fn ) {
            return new Promise( resolve => {
                setTimeout( () => {
                    fn()
                    resolve()
                }, timer )
            } )
        }
        
        function step() {
            var d = Promise.resolve()
            d.then( () => {
                    return tip( 3000, () => {
                        console.log( 'red' )
                    } )
                } )
                .then( () => {
                    return tip( 1000, () => {
                        console.log( 'green' )
                    } )
                } )
                .then( () => {
                    return tip( 2000, () => {
                        console.log( 'yellow' )
                    } )
                } )
                .then(() => {
                    step()
                })
        }

        step()

更多文章,可關注https://github.com/ziwei3749/…

假如有疑問或許發明毛病,能夠在響應的 issues 舉行發問或訂正。

假如喜好或許有所啟示,迎接 star,對作者也是一種勉勵。

參考和一些面試題材料 :

    原文作者:Ziwei
    原文地址: https://segmentfault.com/a/1190000014495616
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞