中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.js中async和await關鍵字如何使用

發布時間:2022-07-04 11:50:52 來源:億速云 閱讀:207 作者:iii 欄目:開發技術

本篇內容主要講解“Node.js中async和await關鍵字如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Node.js中async和await關鍵字如何使用”吧!

async 和 await 關鍵字

async 和 await 是 ES2017 中提出來的,async 和 await 兩個關鍵字的出現,簡化的 Promise 的使用。

async 關鍵字

async關鍵字使用比較簡單,所以 async 的使用注意以下三點即可 :

  • async 用于修飾一個 function

  • async 修飾的函數,總是返回一個 Promise 對象

  • 函數內的所有值,將自動包裝在 resolved 的 promise 中

// async 用于修飾一個 function
//     1. async 修飾的函數,總是返回一個 Promise 對象
//     2. 函數的返回值,將自動包裝在 resolve 的 promise 中

// 1. async 修飾的函數,總是返回一個 Promise 對象
async function fn() {
    // 2. 函數的返回值,將自動包裝在 resolve 的 promise 中
    return '哈哈哈';
}
// 以后看一下博客文章之類的東西,里面會有一些變量使用 :foo 和 bar , 無意義;
const foo = fn();
console.log(foo);
foo.then(res => {
    console.log(res);
});

// 注意: async修飾的函數被稱為異步函數,可他不是異步執行;
console.log('我是最后一行代碼');

await關鍵字

await關鍵字比較繁瑣,注意點比較多。首先,await 只能出現在 async 函數內,await 讓 JS 引擎等待直到promise完成并返回結果,語法:

let value = await promise對象; // 等待promise對象的結果,然后將結果賦值給 value

由于await需要等待promise執行完畢,所以 await會 暫停函數的執行,但不會影響其他同步任務。

所以,await總結如下四點:

  • await只能出現在異步函數中!

  • await能停止代碼執行,讓后面的同步代碼,先執行;

  • await后面跟隨的是一個promise對象;

  • await返回的是: Promise對象中的then()中的回調函數中的參數res;

// 定義一個方法,為的就是返回一個 Promise 對象,讓下面的await使用;
async function getPromise() {
    return '哈哈哈';
}
console.log(1);
// 1.await只能出現在async修飾的函數中!
async function fn() {
    console.log(2);
    // 2.await后面跟隨的是一個promise對象;
    // 3.await返回的是: Promise對象中的then()中的回調函數中的參數res;
    const str = await getPromise();
    console.log(str);
    // 4.await能停止代碼執行,讓后面的同步代碼,先執行;
    console.log(3);
}
// 調用
fn();
console.log(4);
// // 以前用法: 
// axios().then(res => {
//     res.data.map()
// });
// // 以后用法: 
// async function name() {
//     let res = await axios();
//     res.data.map();
// }

async 和 await 解決回調地獄

// async 和 await 解決回調地獄也要用到 then-fs ,因為他直接返回 Promise 對象;

// 導入 then-fs
import thenFs from 'then-fs';

// await 一定要出現在異步函數中
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);
}

// 調用函數
fn();

JS執行機制(事件循環)

  • js代碼開始執行后,主線程執行棧中會把任務分為兩類.

  • 一類是同步任務, 一類是異步任務; 主線程執行棧優先執行同步任務,

  • 異步任務會被放入特定的處理程序中,滿足條件后,被放到消息(任務/事件)隊列中,

  • 主線程執行棧中所有的同步任務執行完畢之后,通過事件循環去消息(任務/事件)隊列中,

  • 挑選優先滿足條件的程序,放入主線程執行棧中執行。事件循環,周而復始,一直執行。

微任務和宏任務

在ES3 以及以前的版本中,JavaScript本身沒有發起異步請求的能力,也就沒有微任務的存在。在ES5之后,JavaScript引入了Promise,這樣,不需要瀏覽器,JavaScript引擎自身也能夠發起異步任務了。  Tick會觸發瀏覽器渲染,Promise不會觸發,所以更加輕量級,多使用;

宏任務

(macro)task,可以理解是每次執行棧執行的代碼就是一個宏任務

  • 主線程上的執行棧中所有的代碼塊

  • setTimeout

  • setInterval

  • Ajax

  • 事件

微任務

微任務(microtask)是宏任務中的一個部分,它的執行時機是在同步代碼執行之后,下一個宏任務執行之前。

總結起來,微任務有:

  • Promise.then

  • process.nextTick(Node.js 環境)

宏任務和微任務執行機制

JS優先執行同步任務,然后執行微任務,最后執行宏任務。

總結:Promise中的then()比大部分異步代碼,優先執行!

// 結論: 如果同一時間既有宏任務又有微任務觸發,那么優先執行微任務;
//     宏任務是宿主發起的會觸發重構,比較浪費資源,后執行;
//     微任務是js解釋器發起的不會觸發重構,比較節省資源,先執行;
// 宏任務
setTimeout(() => {
    //執行后 回調一個宏事件
    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關鍵字如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淅川县| 巴塘县| 盐城市| 马鞍山市| 军事| 华坪县| 遂平县| 浪卡子县| 波密县| 闻喜县| 南江县| 彭水| 大渡口区| 张家口市| 安丘市| 宁津县| 梓潼县| 扬中市| 江山市| 怀集县| 西乡县| 正安县| 高雄县| 蓝田县| 水城县| 南溪县| 云阳县| 沁阳市| 故城县| 简阳市| 佛冈县| 门头沟区| 礼泉县| 临朐县| 阳原县| 富蕴县| 紫阳县| 余姚市| 宾川县| 乌审旗| 阿拉善右旗|