ECMAScript 2018 (ES9) 中的 Promise,遇到 bug 怎么办

阅读时长 5 分钟读完

Promise 是一个常用的用于异步编程的 JavaScript 对象,它可以帮助开发者更好地处理异步操作,并提供了一些常见的异步处理场景的解决方案。在 ECMAScript 2018 (ES9) 中,Promise 有了一些新的特性,本文将深入介绍它们,以及当遇到 bug 时该如何处理。

Promise.allSettled()

在 ES9 中,Promise.allSettled() 新增了一个方法,该方法接收一个 Promise 数组参数,返回一个 Promise 对象,该 Promise 对象的处理方式与 Promise.all() 类似,只不过它的处理方式对于每个 Promise 的处理结果(不论是 resolved 还是 rejected)都会进行收集,而不是当有一个出现 rejected 就会直接返回 rejected。

下面是一个使用 Promise.allSettled() 方法的例子:

-- -------------------- ---- -------
----- -------- - -
  ----------------------------
  ------------------ -------------------
  ------------------------- -------
--

----------------------------
  ------------- -- ---------------------
  ------------ -- ----------------------

结果输出:

上面的例子中,Promise.allSettled() 方法会将所有 Promise 对象的处理结果进行收集,并将结果封装成一个数组返回,数组中的每一项都包含 status 属性和对应的 value/reason 值。

这个新的特性对于在处理异步任务时,不希望因为单个 Promise 的失败而直接返回 rejected 的场景非常有用,比如将多个 HTTP 请求的结果进行聚合后展示到页面上,使用 Promise.allSettled() 方法可以确保每个请求的结果都会被处理到。

Promise.prototype.finally()

在 ES9 中,Promise 原型链上新增了一个 finally() 方法,该方法接收一个回调函数作为参数,该回调函数在 Promise 无论是 fulfilled 还是 rejected 都会被调用,不论 Promise 的状态以及 Promise 中的处理代码执行是发生错误还是正常结束。

下面是一个使用 Promise.prototype.finally() 方法的例子:

结果输出:

上面的例子中,Promise.prototype.finally() 方法中的回调函数总是会被执行,无论 Promise 的状态以及 Promise 中的处理代码执行是否发生错误。

这个新的特性对于在处理异步任务时,需要进行某些资源清理的场景(比如关闭文件句柄、释放内存等)非常有用,可以确保在 Promise 最终状态确定后,回调函数一定会被调用。

遇到 bug 怎么办?

当使用 Promise 进行异步编程时,难免会遇到各种各样的 bug,这时候应该如何解决呢?下面是一些处理 Promise 报错的方法:

1. 使用 Promise.catch()

当 Promise 处理代码出错时,可以使用 Promise.catch() 方法来捕获错误,以便找出问题所在:

2. 使用 try...catch

当 Promise 处理代码出错时,也可以使用 try...catch 来捕获错误,以便找出问题所在:

3. 使用 async/await

使用 async/await 来写代码可以让处理代码更加清晰易读,同时也可以处理异常情况:

总结

ES9 中新增的 Promise.allSettled() 方法和 Promise.prototype.finally() 方法为开发者处理异步编程操作提供了更方便的方式,同时在面对 Promise 报错的情况时,也可以使用一些方法来解决问题。最终目的就是让开发者可以更加高效地进行异步编程,从而更好地实现业务场景的处理。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6521bc9595b1f8cacd92da34

纠错
反馈