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
的特性进行处理。
这是现代化异步编程的标准方式,非常适合需要频繁与数据库交互的场景。
コメント