js: async-await


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

  返回值:

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

  執行順序:

  async的異步指的是async函數后面的代碼是異步的,但async里面還是同步的,但需要注意的是,這里的同步不是說await后面的函數沒執行完就不往下執行(指async里面的await后面的代碼),而是,當調用async函數,程序執行到await時,1.會先去執行一遍await里面的代碼,2.再回到調用async函數后面繼續執行,3.完了之后再回到async里面的await后面繼續執行。前面說的執行一遍不是說全部執行完畢,await后面的函數里如果有一個定時器(5s),那么,程序並不會等待5s后再執行步驟1,而是執行定時器的時候,異步去執行步驟1后面的。

  來看兩個例子:

  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>

  輸出結果:

  //start...

  //執行1

  //執行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后面的代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM