js: async-await

  async是一種用同步的方式編寫異步代碼的方法,與promise同樣也是非阻塞的。promise

  返回值:異步

   async的返回值是一個promise對象。async

  執行順序:函數

  async的異步指的是async函數後面的代碼是異步的,但async裏面仍是同步的,但須要注意的是,這裏的同步不是說await後面的函數沒執行完就不往下執行(指async裏面的await後面的代碼),而是,當調用async函數,程序執行到await時,1.會先去執行一遍await裏面的代碼,2.再回到調用async函數後面繼續執行,3.完了以後再回到async裏面的await後面繼續執行。前面說的執行一遍不是說所有執行完畢,await後面的函數裏若是有一個定時器(5s),那麼,程序並不會等待5s後再執行步驟1,而是執行定時器的時候,異步去執行步驟1後面的。spa

  來看兩個例子:code

  1.若是await後面的函數的返回值是一個直接值,或者沒有返回值的普通函數。對象

    <script>
        function sleep(sec) {
            console.log('執行1');
            setTimeout(function () {
                console.log('執行2');
            }, sec * 1000)
        }

        async function show() {
            console.log('start...');
            let res = await sleep(5);
            console.log('執行3');
        }
        show();
        console.log('執行4');
        console.log('執行5');
    </script>

  輸出結果:blog

  //start...隊列

  //執行1ip

  //執行4

  //執行5

  //執行3

  //執行2

  2.若是await後面返回的是一個promise對象。

       function sleep(sec) {
            console.log('執行1');
            return new Promise(function (resolve, reject) {
                setTimeout(function () {
                    resolve('aaa');//若是不執行resolve,程序不會繼續往下執行
                    console.log('執行2');
                }, sec * 1000)
            })
        }

        async function show() {
            console.log('start...');
            let res = await sleep(5);
            // console.log(res);
            console.log('執行3');
        }
        show();
        console.log('執行4');
        console.log('執行5');   

  輸出結果:

  //start...

  //執行1

  //執行4

  //執行5

  //執行2

  //執行3

 

  解釋:當程序執行到await時,會先去執行sleep裏面代碼,輸出「執行1」,並將返回的promise對象放入promise隊列中,再去執行show()後面的代碼,輸出「執行4」,"執行5",而後再回到async裏等待await的返回值,再繼續await後面的代碼。

相關文章
相關標籤/搜索