異步的意義:
同步與異步:
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