关于 Promise 的异常处理方式,你需要知道的 10 个小技巧
Promise 是 JavaScript 中一种常用的异步编程方式,但是在使用过程中,错误和异常的处理是不可避免的问题。因此,正确的异常处理方式对于代码的健壮性和程序的正确性是非常重要的。本文将介绍 10 个小技巧,帮助你更好地处理 Promise 异常,让你的代码更加健壮和可靠。
- 返回一个 rejected 的 Promise 对象
当在Promise中发生了异常错误,应该让Promise对象进入Rejected状态,然后在Rejected回调中处理。可以直接返回一个 rejected 的 Promise 对象。
-- -------------------- ---- ------- -------- ------------ - ------ --- ----------------- ------- -- - -- ------ -- ------ - ---------- -------------- - ---- - ----------- - -- -展开代码
- 在 Promise 自身中处理异常
使用try-catch语句捕捉 Promise 回调中出现的异常,并在异常部分返回一个 rejected Promise。
-- -------------------- ---- ------- -------- ------------ - ------ --- ----------------- ------- -- - --- - -- ------ ----------- - ----- --- - -- ---- --------- - -- -展开代码
- 使用 Promise.all() 来处理多个 Promise 对象
如果一个程序要依次执行多个异步操作并返回结果,可以使用 Promise.all()。使用 Promise.all() 可以让多个 Promise 对象并行执行,同时全都成功才返回,只要一个 Promise 对象失败就会抛出异常。
Promise.all([ Promise(resolve => setTimeout(resolve, 100, 1)), Promise(resolve => setTimeout(resolve, 50, 2)), Promise(resolve => setTimeout(resolve, 150, 3)) ]) .then(console.log) // [1,2,3] .catch(console.error) // 不管是哪一个 Promise对象失败,都会抛出一个error异常
- 使用 Promise.race() 来处理多个 Promise 对象
如果一个程序要依次执行多个异步操作,但是只需要其中一个异步操作返回结果即可,可以使用 Promise.race()。使用 Promise.race() 可以让多个 Promise 对象并行执行,只要有一个 Promise 返回结果,就把这个结果传递给成功回调。
Promise.race([ Promise(resolve => setTimeout(resolve, 100, 1)), Promise(resolve => setTimeout(resolve, 50, 2)), Promise(resolve => setTimeout(resolve, 150, 3)) ]) .then(console.log) // 2 .catch(console.error) // 不管是哪一个 Promise对象失败,都会抛出一个error异常
- 使用 async/await 处理 Promise 异常
async/await 是 ES6/ES7 引入的异步编程方式,是 Promise 进一步封装的语法糖。async/await 往往可以使异步操作更易于理解和管理,并且在异常场景下更加容易处理。
-- -------------------- ---- ------- ----- -------- ------------ - --- - -- ------ ----- ------ - ----- ------------------ ------ ------ - ----- --- - -- ---- ----- --- -------- - -展开代码
- 使用 .then() 的第二个回调处理异常
Promise 的 then() 方法可以传递两个回调函数:第一个是成功的回调函数,第二个是失败的回调函数。使用 .then() 的第二个回调处理异常的方式可以把结果和异常统一到一起处理。
Promise.resolve(1) .then(result => { // 成功处理 console.log(result); }, error => { // 处理异常 console.log(error) })
- 捕获全局异常
另一种捕获异常的方法是通过 window.onerror 捕获异常。这个事件会在 JavaScript 异常抛出时触发。要注意的是,这个事件不会捕获所有的异常错误,比如 syntax error。
window.onerror = function (message, url, line, col, error) { console.log('message: ', message) console.log('url: ', url) console.log('line: ', line) console.log('col: ', col) console.log('error: ', error) }
- 确认和处理异常堆栈
处理异常时,记录异常堆栈会非常重要。尽可能详细地搜集异常信息,以便更精确地追踪错误。
try { // 异常代码 } catch (e) { console.log('Stack trace: ', e.stack); console.log('Message: ', e.message); }
- 根据环境对异常处理
在不同的环境下,异常处理的方式也需要不同。例如,在生产环境下,可以把异常信息记录到日志中,并发送给开发人员,以便在上线后跟踪问题。
if (process.env.NODE_ENV === 'production') { window.onerror = function (message, url, line, col, error) { // 把异常信息发送给开发人员 console.log(error) } }
- 细节处理:取消异步操作
根据实际情况选择是否 cancel promises。在执行异步操作的时候,可能需要取消异步操作。可以查看文档或尝试使用第三方库来取消 Promise 操作。
-- -------------------- ---- ------- ----- ------- - -------- - ----- --- --------- - ------ -------------------- -- - -- ------------ - ------------------ - ------------- ----- -- - -- ------------ - ---------------- - --- ------------------- --------- -- - --------- - ----- -------------------- ------------- ---展开代码
结语
Promise 是 JavaScript 中异步编程的一种常用语法糖。异常处理在 Promise 中是非常重要的,这也是 Promise 相对于回调函数的优势之一。更好的 Promise 异常处理方式能够让你的代码更加健壮可靠,希望这 10 个小技巧能对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67b984ca306f20b3a67f2862