async函式
async
要理解 async 先要掌握 Promise 的概念,瞭解 Promise 請戳我!
async 函式是什麼?一句話,它就是 Genervator 函式的語法糖。
一個 Genervator 函式,依次讀取兩個檔案。
const fs = require('fs');
const readFile = function(fileName) {
return new Promise((resolve, reject) => {
fs.readFile(fileName, (error, data) => {
if (error) return reject(error);
reslove(data);
})
})
}
const gen = function* () {
const f1 = yield readFile('/etc/fstab');
const f2 = yield readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
}
改寫成 async 函式。
const asyncReadFile = async function() {
// 一旦遇到 await 就先返回,等到非同步操作完成再繼續執行函式體後面的語句
const f1 = await readFile('/etc/fstab');
const f2 = await readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
}
async 函式返回的是一個 Promise 物件。進一步說,async 函式完全可以看作多個非同步操作,包裝成的一個 Promise 物件,而內部的 await
命令就是內部 then
的語法糖。
// async 返回一個 Promise 物件
async function f() {
return 'hello world';
}
// .then 呼叫 Promise 物件
f().then(v => console.log(v));
// "hello world"
async 內部丟擲的異常會導致 Promise 物件變成 reject
的狀態,能夠被 catch
捕獲。
async function f() {
throw new Error('出錯了');
}
f().then(v => console.log(v))
.catch(e => console.log(e));
// Error: 出錯了
await
正常情況下,await 命令後面是一個 Promise 物件。如果不是,會被轉換成一個立即 resolve
的 Promise 物件。
async funciton () {
return await 123;
}
f().then(v => console.log(v));
// 123
只要 await 語句後面的 Promise 變成 reject
,那麼整個 async 函式都會中斷執行。
async function f() {
await Promise.reject('出錯了');
await Promise.reslove('hello world'); // 不會執行
}
如果需要避免這個問題,可以是用 try...catch
。
async function f() {
try {
await Promise.reject('出錯了');
} catch(e) {
}
return await Promise.resolve('hello world');
}
f()
.then(v => console.log(v))
// hello world
案例: 按順序完成非同步操作
實際的開發中,經常遇到一組非同步操作需要按順序完成。比如,以此遠端讀取一組 URL,然後按照讀取順序依次輸出。
async function loginOrder(urls) {
// 併發讀取遠端URL
const textPromises = urls.map(async url => {
const response = await fetch(url);
return response.text();
})
// 按次序輸出
for (const textPromise of textPromises) {
console.log(await textPromise);
}
}
參考
相關文章
- ES6-Generator 函式 和 async 函式函式
- async函式使用場景函式
- generator函式與async/await函式AI
- async函式學習筆記。函式筆記
- async 函式的實現原理函式
- 非同步操作系列之Generator函式與Async函式非同步函式
- 如何更好的編寫async函式函式
- async函式,瞭解一下函式
- async await函式效能與Promise併發AI函式Promise
- async、await和generator函式內部原理AI函式
- 10個必備的 async/await 工具函式AI函式
- 前端-JavaScript非同步程式設計async函式前端JavaScript非同步程式設計函式
- 回撥函式到promise再到理解async/await函式PromiseAI
- vue中非同步函式async和await的用法Vue非同步函式AI
- JavaScript非同步程式設計–Generator函式、async、awaitJavaScript非同步程式設計函式AI
- JS 非同步發展流程(回撥函式=>Async/await)JS非同步函式AI
- 非同步函式async await在wpf都做了什麼?非同步函式AI
- 結合 async 非同步函式 - 提高 Promise 的易用性非同步函式Promise
- 非同步之三:Async 函式的使用及簡單實現非同步函式
- Generator與Promise的完美結合 -- async await函式誕生記PromiseAI函式
- Flutter非同步程式設計-sync*和async*生成器函式Flutter非同步程式設計函式
- 小哥哥小姐姐,來嚐嚐 Async 函式這塊語法糖函式
- 現代 JS 流程控制:從回撥函式到 Promises 再到 Async/AwaitJS函式PromiseAI
- JavaScript非同步程式設計史:回撥函式到Promise到Async/AwaitJavaScript非同步程式設計函式PromiseAI
- 而井教你判斷當前Javascript執行環境是否支援async函式JavaScript函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- 第7章 IF函式 COUNTIF函式 SUMIF函式函式
- MySQL(四)日期函式 NULL函式 字串函式MySql函式Null字串
- (譯) 函式式 JS #2: 函式!函式JS
- 核函式 多項式核函式 高斯核函式(常用)函式
- 第 8 節:函式-匿名函式、遞迴函式函式遞迴
- lambda匿名函式sorted排序函式filter過濾函式map對映函式函式排序Filter
- main函式的入口函式AI函式
- SQL-函式 - 聚合函式SQL函式
- 【每日函式】每日函式(2021.08.16)函式
- 【每日函式】每日函式(2021.08.10)函式