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);
}
}
參考
相關文章
- async函式解析函式
- ES6-Generator 函式 和 async 函式函式
- async函式使用場景函式
- async 函式的實現原理函式
- async函式學習筆記。函式筆記
- generator函式與async/await函式AI
- 非同步操作系列之Generator函式與Async函式非同步函式
- 如何更好的編寫async函式函式
- async函式,瞭解一下函式
- es6解讀 - async函式函式
- async 函式的含義和用法函式
- async、await和generator函式內部原理AI函式
- async await函式效能與Promise併發AI函式Promise
- 前端-JavaScript非同步程式設計async函式前端JavaScript非同步程式設計函式
- 用 Async 函式簡化非同步程式碼函式非同步
- 回撥函式到promise再到理解async/await函式PromiseAI
- 10個必備的 async/await 工具函式AI函式
- vue中非同步函式async和await的用法Vue非同步函式AI
- JavaScript非同步程式設計–Generator函式、async、awaitJavaScript非同步程式設計函式AI
- 非同步函式async await在wpf都做了什麼?非同步函式AI
- 結合 async 非同步函式 - 提高 Promise 的易用性非同步函式Promise
- JS 非同步發展流程(回撥函式=>Async/await)JS非同步函式AI
- 非同步之三:Async 函式的使用及簡單實現非同步函式
- Flutter非同步程式設計-sync*和async*生成器函式Flutter非同步程式設計函式
- 小哥哥小姐姐,來嚐嚐 Async 函式這塊語法糖函式
- Generator與Promise的完美結合 -- async await函式誕生記PromiseAI函式
- 而井教你判斷當前Javascript執行環境是否支援async函式JavaScript函式
- 現代 JS 流程控制:從回撥函式到 Promises 再到 Async/AwaitJS函式PromiseAI
- JavaScript非同步程式設計史:回撥函式到Promise到Async/AwaitJavaScript非同步程式設計函式PromiseAI
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- 深入掌握 ECMAScript 6 非同步程式設計(四):async函式的含義與用法非同步程式設計函式
- Oracle 函式大全(字串函式,數學函式,日期函式,邏輯運算函式,其他函式)Oracle函式字串
- 【函式式 Swift】函式式思想函式Swift
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- 【函式】Oracle函式系列(2)--數學函式及日期函式函式Oracle
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- JavaScript ES7 中使用 async/await 解決回撥函式巢狀問題JavaScriptAI函式巢狀
- 第7章 IF函式 COUNTIF函式 SUMIF函式函式