JavaScript:使用 Promises 和 Async/Await 进行错误处理
JavaScript 中的错误处理可能很简单,但在某些地方却很棘手,尤其是 Promises。JS 允许借助 try、catch 和 throw 进行错误处理。
const main = () => {
try {
// Do something super crazy
if (!bakePizza()) {
throw new Error('Oh no!');
}
} catch (error) {
// That escalated quickly
handleOvenExplosion();
}
}
这看起来很简单,但是当涉及到承诺时就会变得有点棘手。
我们来看一个简单的 Promise 示例。下面的 Promise 函数从数据库中获取用户资料列表,其中结果集由 Promise 函数解析,错误被拒绝。
const userProfileQuery = new Promise((resolve, reject) => {
connection.query('SELECT * FROM Users', [], (err, result) => {
if (err) reject({ type: 'SQL', err});
connection.release();
resolve(result);
});
userProfileQuery
.then((data) => {
const userList = data;
// Do something crazy with the list
})
.catch((err) => {
// Oh, snap!
// Handle error
});
在理想情况下,我们希望有一个 try-catch 块来处理单个文件中发生的所有错误。
const { getUserProfiles } = require('./helpers');
module.exports = () => {
try {
let userProfileList;
getUserProfiles
.then((data) => {
userProfileList = data;
})
.catch((error) => {
// Handle Promise Error
// All errors thrown in this promise land here
});
} catch (error) {
// Handle errors in this module
}
}
上述模块很简单——它借助 Promise 函数获取用户配置文件列表。
但是上述模块的问题在于,当我们在Promise 的块中throw
创建新的错误时,它总是会传递到Promise 的块中。这是因为在Promise 的块中抛出新的错误总是会被传递到调用 Promise 函数的块中。这不允许我们用一个 try-catch 块来处理模块中的所有错误。Error
then
catch
then
catch
但是,唉!有一种方法可以借助 Async/Await 来解决这个问题。让我用一个例子更好地解释一下——
const { getUserProfiles } = require('./helpers');
module.exports = async () => {
try {
const userProfileList = await getUserProfiles;
} catch (error) {
// Handle errors in this module
switch (type) {
case ERROR_SQL:
// Handle SQL errors
default:
// Handle common errors
}
}
}
代码中添加的这个 async/await 小函数做了两件事——
将值分配给由 promise 函数解析的变量。
如果 Promise 函数拒绝任何值,则抛出错误。
请注意,赋值操作仅当 Promise 函数解析了某个值时才有效,并且仅当 Promise 函数拒绝某些值时才会抛出错误。
这样,async/await 让我们的代码保持干净、可维护且易于阅读。
感谢阅读。如果您对此有任何想法,请留下评论。
链接错误:https://dev.to/gitfudge/javascript-error-handling-with-promises-and-async-await-in-es6-3akc