Node.js 与浏览器都支持 Promise,被广泛应用于异步编程。 Promise 提供了更简洁的语法及更好的控制流程,使得回调地狱得到了缓解。但是,对于 Promise 执行中的异常情况处理,如何进行优雅的报错处理也是一个重要的问题。
Promise 异常处理
Promise 自带的异常处理使用 catch 就可以捕获异常,比如:
new Promise((resolve, reject) => { throw new Error('Error!') }).catch(error => { console.log('Oops!', error) })
上面的代码会输出 'Oops! Error!'。 catch 函数就能够处理 Promise 中产生的异常。
catch 函数就像是 try-catch 块里的 catch 一样,能够处理从 Promise 中抛出的异常。但也存在如何处理 Promise 中的多个异常情况、如何优雅地处理异常等问题。
Promise 链式异常处理
由于 Promise 可以链式调用,因此 catch 函数也可以链式调用。一种常见的处理 Promise 链式异常的方式如下:
-- -------------------- ---- ------- ------------ ----------------- ----------------- ------------ -- - ----------------- ------- ------- -- ------------ -- - ----------------- --------- ------ --
上述代码中,如果前面的 Promise 函数出错了,那么就可以在 catch 函数中处理错误。
但是当处理一些逻辑比较复杂的错误时,链式处理可能不够方便。
那么如何才能优雅地处理异常?
方式一:使用普通的函数
使用普通函数来简化错误处理的思路也是常见的方法。定义一个 errorHandler 函数,将 catch 中的处理逻辑放进去。如果实现得当,这样的方式可以使你的代码更干净、更可维护。
-- -------------------- ---- ------- ----- -------- ----------------------- - --- - ----- ------ - ----- ------------ ----- ------------------ ----- ------------------ ----------------- ------- - ----- ------- - ------------------- - - -------- ------------------- - ------------------- --------- ------ -
方式二:使用 async/await
async/await
的另一种好处是能够看到 await函数
的返回值,这使得我们可以非常清晰地处理异常。我们可以在每个 async 函数里面进行错误处理并返回一个错误对象。如果有任何一个异步函数出现了错误,整个代码都会进入到 catch 中。
-- -------------------- ---- ------- ----- -------- ----------------------- - --- - ----- ------- - ----- ------------ ----- ------- - ----- ------------------- ----- ------- - ----- ------------------- ----------------- ------- - ----- ------- - ------------------- --------- ------ - -
方式三:使用 Promise.all
使用 Promise.all 可以让多个异步请求并行执行的方式更简洁。如果任何一个异步请求失败了,整个异步请求都会进入到 catch 块。
async function asyncWithErrorHandler() { try { const [result1, result2, result3] = await Promise.all([asyncFunc1(), asyncFunc2(), asyncFunc3()]) console.log('Task done.') } catch (error) { console.error('Task failed:', error) } }
总结
Promise 可以通过 catch 处理单个异常情况,但是处理更多异常情况时也需要更优雅的处理方式,例如使用普通函数、async/await、Promise.all 等方式。在代码写作时,需要结合项目实际情况、错误类型、异常处理方式来选择合适的处理方案,让代码更易维护和可读性更高。
示例代码
-- -------------------- ---- ------- ----- -------- ----------------------- - --- - ----- --------- -------- -------- - ----- -------------------------- ------------- -------------- ----------------- ------- - ----- ------- - ------------------- --------- ------ - - -------- ------------------- - ------------------- --------- ------ - ----- -------- ------------ - ----- --- ------------ ---- ------------- - ----- -------- ------------ - ------ ------------------ ------------ ---- -------------- - ----- -------- ------------ - ------ ----------------------- ---- ------------- - -----------------------
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646b343f968c7c53b0a9c43e