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...