Promise 是一个常用的用于异步编程的 JavaScript 对象,它可以帮助开发者更好地处理异步操作,并提供了一些常见的异步处理场景的解决方案。在 ECMAScript 2018 (ES9) 中,Promise 有了一些新的特性,本文将深入介绍它们,以及当遇到 bug 时该如何处理。
Promise.allSettled()
在 ES9 中,Promise.allSettled() 新增了一个方法,该方法接收一个 Promise 数组参数,返回一个 Promise 对象,该 Promise 对象的处理方式与 Promise.all() 类似,只不过它的处理方式对于每个 Promise 的处理结果(不论是 resolved 还是 rejected)都会进行收集,而不是当有一个出现 rejected 就会直接返回 rejected。
下面是一个使用 Promise.allSettled() 方法的例子:
-- -------------------- ---- ------- ----- -------- - - ---------------------------- ------------------ ------------------- ------------------------- ------- -- ---------------------------- ------------- -- --------------------- ------------ -- ----------------------
结果输出:
[ {status: "fulfilled", value: "resolved"}, {status: "rejected", reason: Error: rejected at <anonymous>:3:19}, {status: "fulfilled", value: "resolved again"} ]
上面的例子中,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() 方法的例子:
const promise = Promise.resolve('resolved'); promise .finally(() => console.log('finally')) .then(result => console.log(result)) .catch(error => console.error(error));
结果输出:
'finally' 'resolved'
上面的例子中,Promise.prototype.finally() 方法中的回调函数总是会被执行,无论 Promise 的状态以及 Promise 中的处理代码执行是否发生错误。
这个新的特性对于在处理异步任务时,需要进行某些资源清理的场景(比如关闭文件句柄、释放内存等)非常有用,可以确保在 Promise 最终状态确定后,回调函数一定会被调用。
遇到 bug 怎么办?
当使用 Promise 进行异步编程时,难免会遇到各种各样的 bug,这时候应该如何解决呢?下面是一些处理 Promise 报错的方法:
1. 使用 Promise.catch()
当 Promise 处理代码出错时,可以使用 Promise.catch() 方法来捕获错误,以便找出问题所在:
const promise = new Promise(function(resolve, reject) { throw new Error('Oops'); }); promise.catch(function(error) { console.error(error); });
2. 使用 try...catch
当 Promise 处理代码出错时,也可以使用 try...catch 来捕获错误,以便找出问题所在:
try { const promise = new Promise(function(resolve, reject) { throw new Error('Oops'); }); } catch (error) { console.error(error); }
3. 使用 async/await
使用 async/await 来写代码可以让处理代码更加清晰易读,同时也可以处理异常情况:
async function main() { try { const result = await someAsyncFunction(); } catch (error) { console.error(error); } }
总结
ES9 中新增的 Promise.allSettled() 方法和 Promise.prototype.finally() 方法为开发者处理异步编程操作提供了更方便的方式,同时在面对 Promise 报错的情况时,也可以使用一些方法来解决问题。最终目的就是让开发者可以更加高效地进行异步编程,从而更好地实现业务场景的处理。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6521bc9595b1f8cacd92da34