本文我将介绍 Promise 对象上 5 个非常有用的方法,掌握这些方法之后,可以让你更好地解决工作遇到的一些异步问题 。
文章插图
在 JAVAScript 中 , 许多操作都是异步的,比如发起网络请求、读取文件、定时器等 。Promise 提供了一种更加结构化和易于理解的方式来处理异步操作,使得异步代码更加清晰易读,避免了回调地狱的问题 。
本文我将介绍 Promise 对象上 5 个非常有用的方法,掌握这些方法之后,可以让你更好地解决工作遇到的一些异步问题 。
Promise.all()当你需要并行执行多个异步操作,并且只有当所有异步操作都成功完成时才继续执行后续代码 。
const promise1 = Promise.resolve("Promise");const promise2 = new Promise((resolve, reject) => {setTimeout(resolve, 2000, "is");});const promise3 = new Promise((resolve, reject) => {setTimeout(resolve, 1000, "useful");});Promise.all([promise1, promise2, promise3]).then((values) => {console.log(values);});
以上代码成功运行后,控制台会输出以下结果:【有了这五个方法,轻松处理异步任务】
[ 'Promise', 'is', 'useful' ]
但如果某个 promise 对象在执行过程中抛出异常,比如,promise2 对象在执行时抛出异常:const promise2 = new Promise((resolve, reject) => {setTimeout(reject, 2000, new Error("Crash..."));});
那么,你就无法正常获取 promise1 和 promise3 对象返回的结果 。针对这个问题 , 你可以使用 Promise.allSettled() 方法 。Promise.allSettled()当你想要等待多个异步操作完成,并且你需要知道每个异步操作的结果 。
const promise1 = Promise.resolve("Promise");const promise2 = new Promise((resolve, reject) => {setTimeout(reject, 2000, new Error("Crash..."));});const promise3 = new Promise((resolve, reject) => {setTimeout(resolve, 1000, "useful");});Promise.allSettled([promise1, promise2, promise3]).then((values) => {console.log(values);});
运行以上代码之后,控制台会输出以下结果 。数组中每个对象上的 status 属性是用于标识对应 promise 对象的执行状态 。[{ status: 'fulfilled', value: 'Promise' },{status: 'rejected',reason: Error: Crash...},{ status: 'fulfilled', value: 'useful' }]
Promise.race()当你有多个异步操作,并且你只关心哪个操作最先完成,不管它是成功还是失败 。const promise1 = new Promise((resolve, reject) => {setTimeout(reject, 1000, "Promise 1 resolved");});const promise2 = new Promise((resolve, reject) => {setTimeout(resolve, 2000, "Promise 2 resolved");});Promise.race([promise1, promise2]).then((value) => {console.log(value);});
以上代码成功运行后,控制台会输出 "Promise 1 resolved" 。Promise.any()当你有多个异步操作 , 并且你想要得到第一个成功的异步操作的结果 , 而忽略其他已失败的异步操作 。
const promise1 = Promise.reject("any");const promise2 = new Promise((resolve) =>setTimeout(resolve, 100, "Promise 2 resolved"));const promise3 = new Promise((resolve) =>setTimeout(resolve, 500, "Promise 3 resolved"));Promise.any([promise1, promise2, promise3]).then((value) => {console.log(value);});
以上代码成功运行后 , 控制台会输出 "Promise 2 resolved" 。Promise.withResolvers()在某些场景下,我们希望在外部控制 Promise 对象的状态 。比如,在请求网络数据的场景,当成功接收所有数据后 , 才调用 resolve 方法设置当前 Promise 的返回数据 。
let resolve, reject;const promise = new Promise((res, rej) => {resolve = res;reject = rej;});asyncRequest(config, response => {const buffer = [];response.on('callback-request', id => {promise.then(data =https://www.isolves.com/it/cxkf/bk/2024-03-07/> callback(id, data));});response.on('data', data => buffer.push(data));response.on('end', () => resolve(buffer));response.on('error', reason => reject(reason));});
上述的场景在日常工作中很常见,为了避免重复写以下代码 。let resolve, reject;const promise = new Promise((res, rej) => {resolve = res;reject = rej;});
ts39 增加了 proposal-promise-with-resolvers 草案,目前该草案的状态已经是 Stage 4 。不过在使用的过程中,需要注意它的兼容性:推荐阅读
- 有了LLM,所有程序员都将转变为架构师?
- 微信新功能上线!网友:这个真可以
- 电脑桌面什么都没有了怎么办
- 真正聪明的男人,都懂得用这4个“套路”,让女人粘到离不开你!
- 女人有没有给你戴绿帽子,就看这5个痕迹
- 车内放什么防身工具不违法?交警:这几种随便带,不怕查
- 4胎已生?44岁张柏芝抱娃照曝光,眉眼像爸,网友吵翻天:这到底图啥?
- 仅播2集,拿下热榜第一,我断言,这是《鹊刀门传奇》后唯一的天花板古装剧
- 《蜗居》看清宋太的试探,才懂宋思明这一招到底有多愚蠢
- 《浪姐5》来了个国外女星,颜值一流身材也很棒,这下有热闹看了