20個你不得不知道的JS async/await實用技巧
20個你不得不知道的Js async/await用法
1. 基礎用法
async函數(shù)返回一個Promise,而await關鍵詞可以暫停async函數(shù)的執(zhí)行,等待Promise解決。
async function fetchData() {
let data = await fetch('url');
data = await data.json();
return data;
}
2. 錯誤處理
使用try...catch結構處理async/await中的錯誤。
async function fetchData() {
try {
let response = await fetch('url');
response = await response.json();
return response;
} catch (error) {
console.error('Fetching data error:', error);
}
}
3. 并行執(zhí)行
Promise.all()可以用來并行執(zhí)行多個await操作。
async function fetchMultipleUrls(urls) {
const promises = urls.map(url => fetch(url).then(r => r.json()));
return await Promise.all(promises);
}
4. 條件異步
根據(jù)條件執(zhí)行await。
async function fetchData(condition) {
if (condition) {
return await fetch('url');
}
return 'No fetch needed';
}
5. 循環(huán)中的await
在循環(huán)中使用await時,每次迭代都會等待。
async function sequentialStart(urls) {
for (const url of urls) {
const response = await fetch(url);
console.log(await response.json());
}
}
6. 異步迭代器
對于異步迭代器(例如Node.js中的Streams),可以使用for-await-of循環(huán)。
async function processStream(stream) {
for await (const chunk of stream) {
console.log(chunk);
}
}
7. await之后立即解構
直接在await表達式后使用解構。
async function getUser() {
const { data: user } = await fetch('user-url').then(r => r.json());
return user;
}
8. 使用默認參數(shù)避免無效的await
如果await可能是不必要的,可以使用默認參數(shù)避免等待。
async function fetchData(url = 'default-url') {
const response = await fetch(url);
return response.json();
}
9. await在類的方法中
在類的方法中使用async/await。
class DataFetcher {
async getData() {
const data = await fetch('url').then(r => r.json());
return data;
}
}
10. 立刻執(zhí)行的async箭頭函數(shù)
可以立即執(zhí)行的async箭頭函數(shù)。
(async () => {
const data = await fetch('url').then(r => r.json());
console.log(data);
})();
11. 使用async/await進行延時
利用async/await實現(xiàn)延時。
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function delayedLog(item) {
await delay(1000);
console.log(item);
}
12. 使用async/await處理事件監(jiān)聽器
在事件處理函數(shù)中使用async/await。
document.getElementById('button').addEventListener('click', async (event) => {
event.preventDefault();
const data = await fetch('url').then(r => r.json());
console.log(data);
});
13. 以順序方式處理數(shù)組
使用async/await以確定的順序處理數(shù)組。
async function processArray(array) {
for (const item of array) {
await delayedLog(item);
}
console.log('Done!');
}
14. 組合async/await與destructuring以及spread運算符
結合使用async/await,解構和展開操作符。
async function getConfig() {
const { data, ...rest } = await fetch('config-url').then(r => r.json());
return { config: data, ...rest };
}
15. 在對象方法中使用async/await
將async方法作為對象的屬性。
const dataRetriever = {
async fetchData() {
return await fetch('url').then(r => r.json());
}
};
16. 異步生成器函數(shù)
使用async生成器函數(shù)結合yield。
async function* asyncGenerator(array) {
for (const item of array) {
yield await processItem(item);
}
}
17. 使用頂級await
在模塊頂層使用await(需要特定的JavaScript環(huán)境支持)。
// ECMAScript 2020引入頂級await特性, 部署時注意兼容性
const config = await fetch('config-url').then(r => r.json());
18. async/await與IIFE結合
將async函數(shù)與立即執(zhí)行函數(shù)表達式(IIFE)結合。
(async function() {
const data = await fetch('url').then(r => r.json());
console.log(data);
})();
19. 使用async/await優(yōu)化遞歸調用
優(yōu)化遞歸函數(shù)。
async function asyncRecursiveFunction(items) {
if (items.length === 0) return 'done';
const currentItem = items.shift();
await delay(1000);
console.log(currentItem);
return asyncRecursiveFunction(items);
}
20. 在switch語句中使用await
在switch語句的每個case中使用await。
async function fetchDataBasedOnType(type) {
switch (type) {
case 'user':
return await fetch('user-url').then(r => r.json());
case 'post':
return await fetch('post-url').then(r => r.json());
default:
throw new Error('Unknown type');
}
}
以上就是20個你不得不知道的JS async/await實用技巧的詳細內容,更多關于JS async/await技巧的資料請關注腳本之家其它相關文章!
相關文章
JavaScript實現(xiàn)時間表動態(tài)效果
這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)時間表動態(tài)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
javascript高級編程之函數(shù)表達式 遞歸和閉包函數(shù)
這篇文章主要介紹了javascript高級編程之函數(shù)表達式 遞歸和閉包函數(shù)的相關資料,需要的朋友可以參考下2015-11-11
關于Error:Unknown?option?'--inline'報錯的解決辦法
這篇文章主要給大家介紹了關于Error:Unknown?option?'--inline'報錯的解決辦法,文中將解決的辦法介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
JS中for...in?和?for...of?的區(qū)別解析
for?…?in?用于迭代對象的可枚舉字符串屬性,包括自身屬性和繼承的屬性,但不會遍歷對象的原型鏈上的?非可枚舉屬性,以及對象的方法,這篇文章主要介紹了JS中for...in?和?for...of?的區(qū)別,需要的朋友可以參考下2024-03-03

