您好,登錄后才能下訂單哦!
這篇“怎么使用Node.js的async和await進行異步編程”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么使用Node.js的async和await進行異步編程”文章吧。
創建異步函數,并返回相關數值:
一般方式創建
/* 函數直接通過返回Promise成為異步函數 異步函數:返回promise的函數稱之為異步函數 */ function fn(){ return Promise.resolve(10) } // 讀取結果需要通過then去讀取 fn().then(r => { console.log(r) })
通過async方式創建:
/* 通過async可以快速的創建異步函數 */ /* 通過async可以來創建一個異步函數,fn2() 此時就是一個異步函數 異步函數的返回值回自動封裝到一個Promise中返回 */ async function fn2(){ return "async返回的數據10" } // 讀取結果需要通過then去讀取 fn2().then(r => { console.log(r) })
在async聲明的函數中可以使用await關鍵字來調用異步函數
/* 在async聲明的異步函數中可以使用await關鍵字來調用異步函數 */ // 創建一個函數計算 a + b的結果,但是異步,即返回的Promise function sum(a, b){ return new Promise(resolve => { setTimeout(() => { resolve(a + b) }, 2000) }) } // 通過async創建一個異步函數 async function fn3() { sum(123, 456).then(r => { console.log(r) }) } // 調用fn3() fn3()
當我們通過await去調用異步函數時候,它會暫停代碼的運行
直到異步代碼執行有結果時,才會將結果返回
注意 await只能用于 async聲明的異步函數中,或者es模塊的緊急作用域中
await阻塞的只是異步函數內部的代碼,不會影響外部代碼
通過 await 調用異步代碼時,需要通過try-catch來處理異常
/* 在async聲明的異步函數中可以使用await關鍵字來調用異步函數 */ // 創建一個函數計算 a + b的結果,但是異步,即返回的Promise function sum1(a, b){ return new Promise(resolve => { setTimeout(() => { resolve(a + b) }, 2000) }) } /* Promise解決了異步調用中回調函數問題 雖然通過鏈式調用解決了回調地獄,但是鏈式調用太多以后還是不好看 但現在要求以同步的方式去調用異步的代碼 */ async function fn4() { // 鏈式調用 // sum1(123, 456) // .then(r => sum(r, 8)) // .then(r => sum(r, 8)) // .then(r => console.log(r)) // 當我們通過await去調用異步函數時候,它會暫停代碼的運行 // 直到異步代碼執行有結果時,才會將結果返回 // 注意 await只能用于 async聲明的異步函數中,或者es模塊的緊急作用域中 // await阻塞的只是異步函數內部的代碼,不會影響外部代碼 // 通過 await 調用異步代碼時,需要通過try-catch來處理異常 try{ let result = await sum(123, 456) result = await sum(result, 8) result = await sum(result, 9) console.log(result) }catch(e){ console.log("出錯了") } // awwit阻塞的是異步函數內部的代碼 // console.log(123) // console.log(222) // console.log(333) } // 調用fn3() fn4() // await不會阻塞外部代碼 console.log("外部代碼")
如果async聲明的函數沒有寫await,那么它就會依次執行
// 如果async聲明的函數中沒有寫await,那么它里面就會依次執行 async function fn4(){ console.log(1) console.log(2) console.log(3) console.log(4) // 如果有return return 10 } fn4() // fn4等價于fn5 function fn5() { return new Promise(resolve => { console.log(1) console.log(2) console.log(3) console.log(4) resolve(10) // return放在resolve中 fn4如果沒有返回值,resolve就為空 }) } fn5() console.log(5) // 執行結果 1 2 3 4 5 1 2 3 4 5 6
使用await調用函數后,await當前函數后的所有代碼,會先進入微任務隊列
await后的所有代碼,都會放入到微任務隊列中執行
// 同步代碼前加await async function fn6(){ console.log(111) /* 當我們使用await調用函數后,await當前函數后的所有代碼 會在await當前函數執行完畢后,被列入微任務隊列中 */ await console.log(112) // await后的所有代碼,都會放入到微任務隊列中執行 console.log(113) } fn6() console.log(222) // 執行結果為 111 112 222 113 // 等價于 function fn7() { return new Promise(resolve => { console.log(111) // 上面的在此處加了await console.log(112) resolve() }).then(r => { console.log(113) }) }
以上就是關于“怎么使用Node.js的async和await進行異步編程”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。