async原理解析

2021-10-03 17:24:05 字數 2675 閱讀 3691

async函式

async函式原理

常見的關於async的筆試題

async函式

const fs = require(『fs』);

const readfile = function (filename)

resolve(data);

});});

};const foo = function* () ;

複製**把上面**的generator函式 foo 可以寫成 async 函式,就是這樣:

const asyncreadfile = async function () ;

複製**可以發現,async函式就是將generator函式的星號(*)替換成async,將 yield替換成 await,僅此而已。

async函式是基於 generator的改進,體現在以下4點

內建執行器。

generator函式的執行必須靠執行器。所以才有了 thunk函式和co模組,而 async函式自帶執行器。async函式的執行和普通函式一樣。

asyncreadfile();

複製**

更好的語義。

async和await,比起星號和yield,語義更清楚了。

async表示函式裡有非同步操作,await表示緊跟在後面的表示式需要等待結果。

更廣的適應性。

即使 generator函式可以借助co模組自動執行,但是co模組後面只能是thunk函式或promise物件,而async函式的await命令後面,可以是 promise物件和原始型別的值(數值、字串和布林值,但這是會自動轉成立即 resolved的 promise物件)

返回值是 promise。

aysnc函式返回值為 promise,這比generator函式的返回值是iterator物件方便多了。

async函式完全可以看作多個非同步操作,包裝成的乙個promise 物件,而await命令就是內部then命令的語法糖。

總之就是 generator 函式雖然是js借鑑其他語言,根據js本身單執行緒的特點實現的協程,但是使用起來會麻煩很多,每次都要自己去寫執行器,而 async函式就是為了解決這些重複的工作而生的。其實 async函式就是將generaor函式和自動執行器完美地封裝在了一起。

async函式的實現原理

就是將generator函式和自動執行器,包裝在乙個函式裡。

async function fn(args)

function fn(args) )

}複製**所有的 async 函式都可以寫成上面的第二種形式,其中 spawn 函式就是自動執行器。

// 接受 generator 函式作為引數,返回乙個 promise 物件

function spawn(genf) catch(e)

if(next.done)

// 將 next.value 轉成 promise物件

promise.resolve(next.value).then(function(v) );

}, function(e) );

});}// 會反覆呼叫 step

step(function() );});

}複製**可以看到,其實是 generator函式和promise的組合,實現了乙個自動執行器,返回 promise物件

常見的關於async的筆試題

實現乙個sleep:

實現乙個紅綠燈: 紅燈2秒,黃燈1秒,綠燈3秒

使用 async 實現promise.all()的效果

實現乙個 sleep

每隔1秒輸出 1, 2, 3, 4, 5

function sleep(interval) )

}// 用法

async function one2fiveinasync()

}one2fiveinasync();

複製**實現乙個紅綠燈

紅燈2秒,黃燈1秒,綠燈3秒

function sleep(duration) )

}async function changecolor(color, duration)

async function main()

main();

複製**使用 async 實現 promise.all()的效果

假設 getfoo和getbar是兩個用於發起ajax請求的函式。

// 寫法一

let [foo, bar] = await promise.all([getfoo(), getbar()]);

// 寫法二

let foopromise = getfoo();

let barpromise = getbar();

let foo = await foopromise;

let bar = await barpromise;

複製**上面兩種寫法,getfoo 和 getbar 都是同時觸發,這樣就會縮短程式的執行時間。

上面只是簡單示例,思考一下,寫出完整**。

總結async 函式原理就是 generator函式 和 自動執行器包裝了一下。

generator就是可以暫定執行和在之前停下的位置接著執行。比如傳送乙個介面請求,發出之後,js可以去幹其他的事兒,介面請求回來之後(資料通過next傳入),會接著繼續執行。但是它不能自動執行,所以需要自動執行器, thunk函式和co模組都是,但是async給我們封裝得更加完美。

LCD原理解析

硬體體系 3個部分 lcd液晶 屏 lcd驅動晶元 lcd控制器 整合在arm晶元內部 控制器 通過驅動晶元 控制液晶屏 液晶屏種類 stn gf tft tft 在嵌入式中較為常用 lcd控制器結構與模組 由17個可程式設計的暫存器組和一塊 256 16的調色盤內 存組成,通過這些暫存器,可以配置...

session原理解析

首先session跟cookies都是會會話進行跟蹤,session通過在伺服器端記錄資訊來記錄,cookies通過在客戶端記錄資訊來記錄。在此只對session進行分析 session是記錄在伺服器記憶體中的,每當乙個使用者通過瀏覽器第一次進行訪問時進行建立 需要注意只有訪問jsp,servlet...

Kerberos原理解析

kerberos這一名詞 於希臘神話 三個頭的狗 地獄之門守護者 系統設計上採用客戶端 伺服器結構與des加密技術,並且能夠進行相互認證,即客戶端和伺服器端均可對對方進行身份認證。可以用於防止竊聽 防止replay攻擊 保護資料完整性等場合,是一種應用對稱金鑰體制進行金鑰管理的系統。支援sso si...