TypeScript 学习笔记(五):异步编程与错误处理

1. 引言

在前几篇学习笔记中,我们介绍了 TypeScript 的基础知识、高级类型系统、模块与命名空间以及装饰器和高级编程技巧。本篇将重点探讨 TypeScript 中的异步编程与错误处理,帮助你在实际项目中更好地处理异步操作和错误。

2. 异步编程

异步编程是现代 JavaScript 应用程序的核心。TypeScript 完全支持 ES6+ 的异步编程特性,包括回调、Promise 和 async/await

2.1 回调

回调函数是最基本的异步编程模式。

function fetchData(callback: (data: string) => void) {
    setTimeout(() => {
        callback("Data received");
    }, 1000);
}

fetchData((data) => {
    console.log(data);
});

虽然回调函数简单,但容易导致回调地狱(callback hell),使代码难以维护。

2.2 Promise

Promise 是解决回调地狱的一种有效方式,它表示一个异步操作的最终结果或失败原因。

function fetchData(): Promise<string> {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data received");
        }, 1000);
    });
}

fetchData()
    .then((data) => {
        console.log(data);
    })
    .catch((error) => {
        console.error(error);
    });
2.3 async/await

async/await 是 ES2017 引入的语法糖,使异步代码看起来像同步代码,从而更易读和维护。

async function fetchData(): Promise<string> {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data received");
        }, 1000);
    });
}

async function processData() {
    try {
        const data = await fetchData();
        console.log(data);
    } catch (error) {
        console.error(error);
    }
}

processData();

3. 错误处理

在异步编程中,错误处理是一个重要的部分。我们需要确保在异步操作中捕获并处理错误,以避免程序崩溃或数据不一致。

3.1 Promise 错误处理

使用 Promise 时,可以通过 .catch 方法捕获错误。

function fetchData(): Promise<string> {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject("Error occurred");
        }, 1000);
    });
}

fetchData()
    .then((data) => {
        console.log(data);
    })
    .catch((error) => {
        console.error(error);
    });
3.2 async/await 错误处理

使用 async/await 时,可以通过 try/catch 块捕获错误。

async function fetchData(): Promise<string> {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject("Error occurred");
        }, 1000);
    });
}

async function processData() {
    try {
        const data = await fetchData();
        console.log(data);
    } catch (error) {
        console.error(error);
    }
}

processData();
3.3 全局错误处理

在某些情况下,可能需要捕获未处理的 Promise 错误。可以通过全局事件处理程序来实现。

process.on("unhandledRejection", (reason, promise) => {
    console.error("Unhandled Rejection at:", promise, "reason:", reason);
});

4. 实战示例

4.1 使用 Fetch API 获取数据

以下示例展示了如何使用 Fetch API 异步获取数据,并处理可能的错误。

async function fetchUserData(userId: string): Promise<any> {
    const response = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}`);
    if (!response.ok) {
        throw new Error("Network response was not ok " + response.statusText);
    }
    return await response.json();
}

async function displayUserData(userId: string) {
    try {
        const userData = await fetchUserData(userId);
        console.log(userData);
    } catch (error) {
        console.error("Failed to fetch user data:", error);
    }
}

displayUserData("1");
4.2 模拟异步任务

模拟多个异步任务,并在所有任务完成后处理结果。

function asyncTask(id: number): Promise<string> {
    return new Promise((resolve, reject) => {
        const duration = Math.floor(Math.random() * 2000) + 1000;
        setTimeout(() => {
            if (Math.random() > 0.7) {
                reject(`Task ${id} failed`);
            } else {
                resolve(`Task ${id} completed in ${duration}ms`);
            }
        }, duration);
    });
}

async function runTasks() {
    const tasks = [1, 2, 3, 4, 5].map((id) => asyncTask(id));
    try {
        const results = await Promise.all(tasks);
        console.log("All tasks completed:", results);
    } catch (error) {
        console.error("One of the tasks failed:", error);
    }
}

runTasks();

5. 结论

在本篇学习笔记中,我们探讨了 TypeScript 中的异步编程与错误处理,涵盖了回调、Promise、async/await 以及如何捕获和处理异步操作中的错误。通过掌握这些知识,你可以在实际项目中更好地处理异步操作和错误,编写出更可靠和可维护的代码。

下一篇学习笔记将介绍 TypeScript 与前端框架的结合应用,如 Angular 和 React,希望你能继续关注本系列的学习笔记,进一步提升 TypeScript 编程技能。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Evaporator Core

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值