Node.js中的async?和?await?關鍵字微任務和宏任務
async 和 await 關鍵字
async 和 await 是 ES2017 中提出來的,async 和 await 兩個關鍵字的出現(xiàn),簡化的 Promise 的使用。
async 關鍵字
async關鍵字使用比較簡單,所以 async 的使用注意以下三點即可 :
- async 用于修飾一個 function
- async 修飾的函數(shù),總是返回一個 Promise 對象
- 函數(shù)內(nèi)的所有值,將自動包裝在 resolved 的 promise 中
// async?用于修飾一個?function
// 1. async?修飾的函數(shù),總是返回一個?Promise?對象
// 2. 函數(shù)的返回值,將自動包裝在?resolve?的?promise?中
// 1. async?修飾的函數(shù),總是返回一個?Promise?對象
async function fn() {
// 2. 函數(shù)的返回值,將自動包裝在?resolve?的?promise?中
return '哈哈哈';
}
// 以后看一下博客文章之類的東西,里面會有一些變量使用 :foo 和 bar , 無意義;
const foo = fn();
console.log(foo);
foo.then(res => {
console.log(res);
});
// 注意: async修飾的函數(shù)被稱為異步函數(shù),可他不是異步執(zhí)行;
console.log('我是最后一行代碼');await關鍵字
await關鍵字比較繁瑣,注意點比較多。首先,await 只能出現(xiàn)在 async 函數(shù)內(nèi),await 讓 JS 引擎等待直到promise完成并返回結果,語法:
let value = await promise對象; // 等待promise對象的結果,然后將結果賦值給 value
由于await需要等待promise執(zhí)行完畢,所以 await會 暫停函數(shù)的執(zhí)行,但不會影響其他同步任務。
所以,await總結如下四點:
- await只能出現(xiàn)在異步函數(shù)中!
- await能停止代碼執(zhí)行,讓后面的同步代碼,先執(zhí)行;
- await后面跟隨的是一個promise對象;
- await返回的是: Promise對象中的then()中的回調(diào)函數(shù)中的參數(shù)res;
// 定義一個方法,為的就是返回一個 Promise 對象,讓下面的await使用;
async function getPromise() {
return '哈哈哈';
}
console.log(1);
// 1.await只能出現(xiàn)在async修飾的函數(shù)中!
async function fn() {
console.log(2);
// 2.await后面跟隨的是一個promise對象;
// 3.await返回的是: Promise對象中的then()中的回調(diào)函數(shù)中的參數(shù)res;
const str = await getPromise();
console.log(str);
// 4.await能停止代碼執(zhí)行,讓后面的同步代碼,先執(zhí)行;
console.log(3);
}
// 調(diào)用
fn();
console.log(4);
// // 以前用法:
// axios().then(res => {
// res.data.map()
// });
// // 以后用法:
// async function name() {
// let res = await axios();
// res.data.map();
// }async 和 await 解決回調(diào)地獄
// async 和 await 解決回調(diào)地獄也要用到 then-fs ,因為他直接返回 Promise 對象;
?
// 導入 then-fs
import thenFs from 'then-fs';
?
// await 一定要出現(xiàn)在異步函數(shù)中
async function fn() {
? ?let str1 = await thenFs.readFile('./txt/a.txt', 'utf8');
? ?console.log(str1);
? ?let str2 = await thenFs.readFile('./txt/b.txt', 'utf8');
? ?console.log(str2);
? ?let str3 = await thenFs.readFile('./txt/c.txt', 'utf8');
? ?console.log(str3);
}
?
// 調(diào)用函數(shù)
fn();JS執(zhí)行機制(事件循環(huán))
- js代碼開始執(zhí)行后,主線程執(zhí)行棧中會把任務分為兩類.
- 一類是同步任務, 一類是異步任務; 主線程執(zhí)行棧優(yōu)先執(zhí)行同步任務,
- 異步任務會被放入特定的處理程序中,滿足條件后,被放到消息(任務/事件)隊列中,
- 主線程執(zhí)行棧中所有的同步任務執(zhí)行完畢之后,通過事件循環(huán)去消息(任務/事件)隊列中,
- 挑選優(yōu)先滿足條件的程序,放入主線程執(zhí)行棧中執(zhí)行。事件循環(huán),周而復始,一直執(zhí)行。
微任務和宏任務
在ES3 以及以前的版本中,JavaScript本身沒有發(fā)起異步請求的能力,也就沒有微任務的存在。在ES5之后,JavaScript引入了Promise,這樣,不需要瀏覽器,JavaScript引擎自身也能夠發(fā)起異步任務了。 ? Tick會觸發(fā)瀏覽器渲染,Promise不會觸發(fā),所以更加輕量級,多使用;
宏任務
(macro)task,可以理解是每次執(zhí)行棧執(zhí)行的代碼就是一個宏任務
- 主線程上的執(zhí)行棧中所有的代碼塊
- setTimeout
- setInterval
- Ajax
- 事件
微任務
微任務(microtask)是宏任務中的一個部分,它的執(zhí)行時機是在同步代碼執(zhí)行之后,下一個宏任務執(zhí)行之前。
總結起來,微任務有:
- Promise.then
- process.nextTick(Node.js 環(huán)境)
宏任務和微任務執(zhí)行機制
JS優(yōu)先執(zhí)行同步任務,然后執(zhí)行微任務,最后執(zhí)行宏任務。
總結:Promise中的then()比大部分異步代碼,優(yōu)先執(zhí)行!
// 結論: 如果同一時間既有宏任務又有微任務觸發(fā),那么優(yōu)先執(zhí)行微任務;
// 宏任務是宿主發(fā)起的會觸發(fā)重構,比較浪費資源,后執(zhí)行;
// 微任務是js解釋器發(fā)起的不會觸發(fā)重構,比較節(jié)省資源,先執(zhí)行;
// 宏任務
setTimeout(() => {
//執(zhí)行后 回調(diào)一個宏事件
console.log('1')
}, 0)
// 同步代碼
console.log('2');
// 同步代碼
new Promise((resolve) => {
console.log('3');
resolve()
// 微任務
}).then(() => {
console.log('4');
// 微任務
}).then(()=>{
console.log('5')
})
// 同步代碼
console.log('6')
// 2 3 6 4 5 1到此這篇關于Node.js中的async 和 await 關鍵字微任務和宏任務的文章就介紹到這了,更多相關Node.js async 和 await 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Nodejs Buffer的使用及Stream流和事件機制詳解
這篇文章主要為大家介紹了Nodejs Buffer的使用及Stream流和事件機制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
nodejs利用ajax實現(xiàn)網(wǎng)頁無刷新上傳圖片實例代碼
本篇文章主要介紹了nodejs利用ajax實現(xiàn)網(wǎng)頁無刷新上傳圖片實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
初學者如何快速搭建Express開發(fā)系統(tǒng)步驟詳解
這篇文章主要介紹了初學者如何快速搭建Express開發(fā)系統(tǒng),結合實例形式詳細分析了express框架搭建的具體步驟與相關注意事項,需要的朋友可以參考下2023-05-05
Nodejs進階:如何將圖片轉成datauri嵌入到網(wǎng)頁中去實例
這篇文章主要介紹了Nodejs進階:如何將圖片轉成datauri嵌入到網(wǎng)頁中去,有興趣的可以了解一下。2016-11-11
在Node.js下運用MQTT協(xié)議實現(xiàn)即時通訊及離線推送的方法
這篇文章主要介紹了在Node.js下運用MQTT協(xié)議實現(xiàn)即時通訊及離線推送的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-01-01
express框架實現(xiàn)基于Websocket建立的簡易聊天室
本篇文章主要介紹了express框架實現(xiàn)基于Websocket建立的簡易聊天室,具有一定的參考價值,有興趣的可以了解一下2017-08-08

