prmoise,async和await,同步與異步的理解


異步的意義:

同步與異步:

1.同步任務:在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行后一個任務。

2.異步任務:不進入主線程,任務隊列的任務,只有任務隊列通知主線程,某個異步任務可以執行了,這個任務才會進入主線程執行。

js為單線程執行,同步的寫法導致如果執行中有一個任務耗時較長,js就會一直等待該任務直到返回結果后才會繼續向下執行。這樣就造成了代碼執行阻塞的問題。於是有異步的方式可以讓某些任務進入到一個異步隊列中,暫時讓主進程跳過該任務繼續向下執行。

異步的解決:

在異步中,如果需要前一個任務的結果作為下一個任務的參數執行,就需要在前一個任務的類似success()中繼續寫下一個人物的代碼,造成嵌套層級過多的回調地獄。於是使用promise可以解決這個問題,例如鏈式操作的then(),catch(),但如果多個promise同時處理還是會寫出類似回調地獄的寫法。而搭配async和await可以達到用同步的方法處理異步。

關於promise.then()返回的新promise的結果狀態由什么決定?

  .then()方法里接收兩個函數作為參數,分別是resolve和jeject后執行的回調。返回的一個新的promise實例。相當於then方法是兩個實際的回調函數,第一個回調函數是定義promise執行成功時resolve括號里的數據,這樣就可以異步拿到數據了。第二個回調函數是定義promise執行失敗時reject括號里的數據。

  1.return值的情況

    function test(){
    const promise = new Promise((resolve,reject)=> {
      setTimeout(function(){
              resolve('執行成功')
      },1000)
        })
        return promise;
    }
    test().then(aData =>{
    console.log('aData',aData)
    return '9'
    }).then(bData =>{
    console.log('bData',bData)
    })
    輸出結果是:
    aData 執行成功
    bData 9

    當不寫return 9時,第二行輸出為undefined

  2.throw error

  返回得promise會成為rejected的狀態,下一步執行catch中的回調函數或者then的第二個回調函數參數。

  3.返回一個新promise,此promise的結果就會成為新promise的結果

ps:promise.all()方法:

Promise.all方法用於將多個Promise實例,包裝成一個新的Promise實例。

var p = Promise.all([p1,p2,p3]);

上面代碼中,Promise.all方法接受一個數組作為參數,p1、p2、p3都是Promise對象的實例。(Promise.all方法的參數不一定是數組,但是必須具有iterator接口,且返回的每個成員都是Promise實例。)

p的狀態由p1、p2、p3決定,分成兩種情況。

只有p1、p2、p3的狀態都變成fulfilled,p的狀態才會變成fulfilled,此時p1、p2、p3的返回值組成一個數組,傳遞給p的回調函數。
只要p1、p2、p3之中有一個被rejected,p的狀態就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調函數。

  promise.rase()方法:

Promise.race方法同樣是將多個Promise實例,包裝成一個新的Promise實例。

var p = Promise.race([p1,p2,p3]);
上面代碼中,只要p1、p2、p3之中有一個實例率先改變狀態,p的狀態就跟着改變。那個率先改變的Promise實例的返回值,就傳遞給p的回調函數。

如果Promise.all方法和Promise.race方法的參數,不是Promise實例,就會先調用下面講到的Promise.resolve方法,將參數轉為Promise實例,再進一步處理。

 

async,await的概念和意義:

於是有了async和await,async的函數中可以有一個或多個異步操作,一旦遇到await就會返回一個pending等待狀態的promise對象,暫時返回了執行代碼的控制權。使得函數外的代碼得以繼續執行。這是保證非阻塞的部分。等await后的異步請求resolve或reject,主線程才會繼續執行async函數內后面的部分。async函數內部異步代碼就像被同步執行一樣,而不是阻塞主線程知道異步調用返回。

一句話概括:async函數內阻塞,函數外不阻塞。

 

 

async:作為關鍵字寫在函數前,代表改函數為異步函數,不會阻塞后續的進行。函數會返回一個promise對象,用then()獲取其中的值,如果函數內部拋出錯誤,有一個catch()方法進行捕獲。

await“:等待一個返回值,常量變量函數promise等,

為什么await只能配合async中使用?

await等的是一個返回結果,如果是同步狀態,即直接返回了,如果是異步,await會阻塞接下來的流程,直到返回結果,而async會被包裹在一個promise中執行,所以await只能在async中使用,否則阻塞正常進程。

資料:https://www.zhihu.com/question/62254462


免責聲明!

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



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