try...catch 和 Promise
复习 promise 的概念和用法
今天、复习了promise的概念,而复习的过程中,重新认识了 try .. catch 工具的语法。
try...catch 和 Promise 都是用于处理错误的工具,但它们的作用和使用场景略有不同。它们之间是有关系的,特别是在处理异步代码时,try...catch 可以与 Promise 结合使用,提供更强大的错误处理能力。
区别:
- try…catch:主要用于捕获同步代码中的错误。当一个同步操作抛出错误时,
try...catch可以捕获并处理。 - Promise:主要用于处理异步操作的结果和错误。它提供了
.catch()方法来处理Promise被拒绝时的错误。
关系:
Promise 和 try...catch 可以结合使用,尤其是在异步代码中。
- 同步错误:
try...catch可以捕获在Promise内部同步代码抛出的错误。 - 异步错误:
Promise的.catch()方法用于捕获Promise内部异步操作的错误。
示例:结合使用 try...catch 和 Promise
1. 在 async 函数中使用 try…catch 捕获 Promise 错误
当使用 async/await 来处理 Promise 时,try...catch 可以用来捕获 Promise 中的错误。
async function fetchData() { |
在这个例子中,await 等待的 fetch 是一个 Promise,如果请求失败或者数据解析出错,catch 块会捕获到错误。
2. 处理同步错误和异步错误
你可以同时捕获同步错误和异步错误:
function riskyFunction() { |
在这个例子中,try...catch 捕获了同步错误 riskyFunction() 中抛出的错误,而异步错误通过 async/await 和 catch 块捕获。
3. 使用 Promise.catch() 处理异步错误
如果没有使用 async/await,你可以通过 .catch() 来处理 Promise 错误:
new Promise((_, reject) => reject('Promise 错误')) |
关键点:
- 同步代码:使用
try...catch捕获同步代码中的错误。 - 异步代码:使用
Promise的.catch()或async/await+try...catch来捕获异步操作中的错误。
总结:
try...catch是用于捕获同步代码中的错误,与 Promise 的关系体现在异步代码处理上,特别是结合async/await使用时。- 在异步代码中,
Promise会处理异步操作的错误,而try...catch用于捕获和处理同步操作的错误。 - 如果你在
async函数中使用await,你可以使用try...catch来捕获Promise被拒绝时的错误。
mysql2/promise 中的 Promise 功能
- mysql2 库简介:
mysql2是一个高性能、轻量级的 Node.js MySQL 客户端库,支持回调和Promise。mysql2/promise是mysql2的一个子模块,专门提供 Promise API。
- 为什么用 Promise?
- 数据库查询是异步操作,传统上用回调处理,可能导致「回调地狱」。
Promise或async/await的方式使代码更简洁、易读,且错误处理更方便。
- 作用:
- 将数据库操作封装为
Promise对象,使查询结果可以通过.then()或await获取。 - 如果数据库操作失败,返回一个被拒绝的
Promise,可以用.catch()或try...catch捕获错误。
- 将数据库操作封装为
代码解析
const mysql = require('mysql2/promise'); |
具体含义:
- require(‘mysql2/promise’):
- 导入
mysql2的Promise API模块,所有数据库操作返回的结果都是Promise对象。
- 导入
- mysql.createPool():
- 创建一个连接池,允许多个数据库查询请求复用连接,提升性能。
- 返回一个连接池对象
db,这个对象中的方法(如db.query)都是基于Promise的。
- 导出 db 对象:
- 你可以在其他文件中引入这个模块,并使用
async/await或.then()的方式进行数据库查询。
- 你可以在其他文件中引入这个模块,并使用
如何使用 Promise 的 API 操作数据库
使用 async/await:
这是最推荐的方式,代码更加简洁和直观。
const db = require('./path_to_db_file'); |
使用 .then 和 .catch:
如果不想用 async/await,也可以用传统的 Promise 链。
const db = require('./path_to_db_file'); |
错误处理
无论是用 async/await 还是 .then/.catch,都可以捕获查询过程中的错误。例如:
- 数据库连接失败:如果连接信息(如
host、user、password)不正确,Promise会被拒绝。 - SQL 查询语法错误:如果执行的 SQL 查询有语法错误,也会触发错误。
示例:
async function faultyQuery() { |
总结
在 mysql2/promise 中:
Promise让异步数据库操作更加简洁。- 通过
async/await或.then/.catch获取查询结果或处理错误。 - 你的代码中
mysql2/promise返回的是基于Promise的连接池对象db,后续所有操作都会利用Promise的特性进行处理。
这是现代化异步编程的标准方式,非常适合需要频繁与数据库交互的场景。
コメント