ES7之async/await 同步還是非同步
async/await作為ES7的標準被視作javascript非同步函式操作的終極解決方案(超越Promise和Generator)越來越受到重視,而隨著前端構建工具的蓬勃發展,通過配置babel我們在專案中也可以直接使用這一新特性而無需太過在意瀏覽器的相容性問題。
有很多技術部落格對這兩個概念有非常棒的闡述,我之所以自己再寫一篇主要是為了筆下走一遍加深理解同時方便以後翻看。也是因為最近在做的一件事情,是將我們Angular4 + Typescript專案中的Promise操作全部替換為async/await。藉著這個機會把這兩個關鍵字用一個最簡單的例子再總結一下。
定義
呼叫async函式時會返回一個Promise物件。當這個async函式返回一個值時,Promise的resolve方法會負責傳遞這個值;當async函式丟擲異常時,Promise 的 reject 方法也會傳遞這個異常值。
async函式中可能會有await表示式,這會使async函式暫停執行,等待表示式中的 Promise 解析完成後繼續執行async函式並返回解決結果。
async/await的目的是在promises的基礎上進一步簡化非同步的同步呼叫,它能對一組Promises執行一些操作。正如Promises類似於結構化回撥,async/await類似於組合生成器和promises。
總結
上面是官網的相關描述,從這裡可以提煉出以下幾個關鍵點:
- async/await 本質上依然是基於Promise,但在使用上更加簡便符合自然習慣。
- async函式內部同步執行。await之間相當於.then。
- async函式外部的呼叫非同步執行。
- 需要try/catch await應對promise reject的情況。
栗子
下面是一個簡單的例子涵蓋上面總結的四點:
function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
function resolveInPromiseRightNow(x) {
return new Promise(resolve => {
resolve('data from previous await: ' + x);
});
}
return new Promise((resolve, reject) => {
reject('reject' );
});
}
function fn1() {
console.log('normal function');
}
// await只能在async函式中執行並且在async中是阻塞的
async function asyncFunction() {
var x = await resolveAfter2Seconds('resolve after 2s');
console.log(x);
console.log('message between 2 await');
var y = await resolveInPromiseRightNow(x);
console.log(y);
try {
await rejectInPromise();
} catch(ex) {
console.log(ex);
}
}
// .then說明Promise本質
asyncFunction().then(() => {
console.log('await completed');
});
fn1();
/// 結果
// normal function
/// 2s後
// resolve after 2s
// message between 2 await
// data from previous await: resolve after 2s
// reject
// await completed
相關文章
- Django是同步框架還是非同步框架Django框架非同步
- 非同步神器async-await非同步AI
- Async and Await 非同步和等待AI非同步
- 理解 es7 async awaitAI
- JS非同步程式設計之async&awaitJS非同步程式設計AI
- 理解非同步之美:Promise 與 async await(二)非同步PromiseAI
- 理解非同步之美:Promise與async await(一)非同步PromiseAI
- async/await非同步不阻塞呼叫AI非同步
- JS非同步之callback、promise、async+await簡介JS非同步PromiseAI
- 重讀 ES6 - async+await 同步/非同步方案AI非同步
- JavaScript async和await 非同步操作JavaScriptAI非同步
- C# 非同步操作 async awaitC#非同步AI
- async 和 await 之非同步程式設計的學習AI非同步程式設計
- 記錄--localStorage是同步還是非同步的?為什麼?非同步
- C# 同步 非同步 回撥 狀態機 async await DemoC#非同步AI
- 理解ES7中的async/awaitAI
- Flutter非同步程式設計-async和awaitFlutter非同步程式設計AI
- 非同步程式設計新方式async/await非同步程式設計AI
- async / await:更好的非同步解決方案AI非同步
- Android面試題:bindService獲取代理是同步還是非同步Android面試題非同步
- [完結篇] - 理解非同步之美 --- promise與async await (三)非同步PromiseAI
- async/await 非同步應用的常用場景AI非同步
- 深入理解 JavaScript 非同步系列(5)—— async awaitJavaScript非同步AI
- .NET 中的 async/await 非同步程式設計AI非同步程式設計
- 20170702-非同步程式設計之 async await非同步程式設計AI
- Promise(es6)和await,async(es7)PromiseAI
- Vue 中 Promise 的then方法非同步使用及async/await 非同步使用總結VuePromise非同步AI
- 使用async/await更好的解決非同步問題AI非同步
- vue中非同步函式async和await的用法Vue非同步函式AI
- JavaScript非同步程式設計–Generator函式、async、awaitJavaScript非同步程式設計函式AI
- promise、async、await非同步原理與執行順序PromiseAI非同步
- JS非同步程式設計 (2) – Promise、Generator、async/awaitJS非同步程式設計PromiseAI
- JS非同步程式設計——深入理解async/awaitJS非同步程式設計AI
- JavaScript非同步程式設計大冒險: Async/AwaitJavaScript非同步程式設計AI
- C# 非同步程式設計Task(三) async、awaitC#非同步程式設計AI
- 非同步程式設計之Async,Await和ConfigureAwait的關係非同步程式設計AI
- React setState是非同步嗎?React非同步
- 非同步函式async await在wpf都做了什麼?非同步函式AI