20个你不得不知道的Js async/await用法

20个你不得不知道的Js async/await用法

JavaScript的asyncawait关键词是现代JavaScript异步编程的核心。它们让异步代码看起来和同步代码几乎一样,使得异步编程变得更加直观和易于管理。本文介绍20个关于async/await的实用技巧,将大大提升编程效率和代码的清晰度。

1. 基础用法

async函数返回一个Promise,而await关键词可以暂停async函数的执行,等待Promise解决。

javascript 复制代码
async function fetchData() {
    let data = await fetch('url');
    data = await data.json();
    return data;
}

2. 错误处理

使用try...catch结构处理async/await中的错误。

javascript 复制代码
async function fetchData() {
    try {
        let response = await fetch('url');
        response = await response.json();
        return response;
    } catch (error) {
        console.error('Fetching data error:', error);
    }
}

3. 并行执行

Promise.all()可以用来并行执行多个await操作。

javascript 复制代码
async function fetchMultipleUrls(urls) {
    const promises = urls.map(url => fetch(url).then(r => r.json()));
    return await Promise.all(promises);
}

4. 条件异步

根据条件执行await

javascript 复制代码
async function fetchData(condition) {
    if (condition) {
        return await fetch('url');
    }
    return 'No fetch needed';
}

5. 循环中的await

在循环中使用await时,每次迭代都会等待。

javascript 复制代码
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循环。

javascript 复制代码
async function processStream(stream) {
    for await (const chunk of stream) {
        console.log(chunk);
    }
}

7. await之后立即解构

直接在await表达式后使用解构。

javascript 复制代码
async function getUser() {
    const { data: user } = await fetch('user-url').then(r => r.json());
    return user;
}

8. 使用默认参数避免无效的await

如果await可能是不必要的,可以使用默认参数避免等待。

javascript 复制代码
async function fetchData(url = 'default-url') {
    const response = await fetch(url);
    return response.json();
}

9. await在类的方法中

在类的方法中使用async/await

javascript 复制代码
class DataFetcher {
    async getData() {
        const data = await fetch('url').then(r => r.json());
        return data;
    }
}

10. 立刻执行的async箭头函数

可以立即执行的async箭头函数。

javascript 复制代码
(async () => {
    const data = await fetch('url').then(r => r.json());
    console.log(data);
})();

11. 使用async/await进行延时

利用async/await实现延时。

javascript 复制代码
function delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function delayedLog(item) {
    await delay(1000);
    console.log(item);
}

12. 使用async/await处理事件监听器

在事件处理函数中使用async/await

javascript 复制代码
document.getElementById('button').addEventListener('click', async (event) => {
    event.preventDefault();
    const data = await fetch('url').then(r => r.json());
    console.log(data);
});

13. 以顺序方式处理数组

使用async/await以确定的顺序处理数组。

javascript 复制代码
async function processArray(array) {
    for (const item of array) {
        await delayedLog(item);
    }
    console.log('Done!');
}

14. 组合async/awaitdestructuring以及spread运算符

结合使用async/await,解构和展开操作符。

javascript 复制代码
async function getConfig() {
    const { data, ...rest } = await fetch('config-url').then(r => r.json());
    return { config: data, ...rest };
}

15. 在对象方法中使用async/await

async方法作为对象的属性。

javascript 复制代码
const dataRetriever = {
    async fetchData() {
        return await fetch('url').then(r => r.json());
    }
};

16. 异步生成器函数

使用async生成器函数结合yield

javascript 复制代码
async function* asyncGenerator(array) {
    for (const item of array) {
        yield await processItem(item);
    }
}

17. 使用顶级await

在模块顶层使用await(需要特定的JavaScript环境支持)。

javascript 复制代码
// ECMAScript 2020引入顶级await特性, 部署时注意兼容性
const config = await fetch('config-url').then(r => r.json());

18. async/await与IIFE结合

async函数与立即执行函数表达式(IIFE)结合。

javascript 复制代码
(async function() {
    const data = await fetch('url').then(r => r.json());
    console.log(data);
})();

19. 使用async/await优化递归调用

优化递归函数。

javascript 复制代码
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

javascript 复制代码
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');
    }
}
相关推荐
小曲曲31 分钟前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
学不会•2 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
EasyNTS3 小时前
H.264/H.265播放器EasyPlayer.js视频流媒体播放器关于websocket1006的异常断连
javascript·h.265·h.264
活宝小娜4 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点4 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow4 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o4 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
刚刚好ā5 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
yqcoder6 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
会发光的猪。7 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js