(四)前端,如此简单!---Promise

如果说 Fetch 解决了"前端如何获取数据"的问题,那么 Promise 解决的则是"拿到数据后如何优雅、可靠地处理异步逻辑"的问题。

Promise创建时一定是 pending(等待中),一个 Promise 只能从 pending 变为 fulfilled 或 rejected,且状态一旦改变就不可逆。

一、Promise.all()

复制代码
const promise = Promise.all(iterable);	//全部成功,返回状态为 fulfilled 的 Promise
promise				   // 一旦 iterable 中有一个 Promise 被 reject,Promise.all 返回的 Promise 就会立即 reject
  .then(results => {				  // 并携带第一个被拒绝的 Promise 的错误原因
    console.log('全部成功,结果数组:', results);  // 其他 Promise 不会停止执行,只是结果被忽略 
  })
  .catch(error => {
    console.error('第一个失败的原因:', error);
  });

二、Promise.allSettled()

复制代码
const promise = Promise.allSettled(iterable);   // 等待所有 Promise 完成(无论成功或失败),返回的 Promise 始终为 fulfilled
promise										  // 结果Promise数组中,每个元素都有 status 属性,值为 'fulfilled' 或 'rejected'
  .then(results => {
    console.log('所有 Promise 都已 settled,结果数组:', results);
    // results 是一个数组,每个元素是一个对象:
    // 如果对应 Promise 成功:{ status: 'fulfilled', value: 成功值 }
    // 如果对应 Promise 失败:{ status: 'rejected', reason: 失败原因 }
  })
  // 注意:Promise.allSettled 永远不会进入 catch,因为它总是 resolve
  .finally(() => {
    console.log('操作结束,无论成功或失败');
  });

三、Promise.any()

  • 只要迭代器中的任何一个 Promise 成功(fulfilled),返回的 Promise 就会立即以该成功值解决。
  • 如果所有 Promise 都拒绝,则返回的 Promise 才会拒绝,并抛出一个 AggregateError 实例,其 errors 属性包含所有拒绝原因的数组。

其他传入的 Promise 仍然会继续执行,并不会被取消或中止,它们的最终结果会被忽略。

复制代码
const p1 = Promise.reject('错误1');
const p2 = Promise.resolve('成功');
const p3 = Promise.reject('错误2');

Promise.any([p1, p2, p3])
  .then(value => console.log('成功:', value))  // 输出: 成功: 成功
  .catch(err => console.log('全部失败:', err.errors));

Promise.any([p1, p3])
  .then(value => console.log('成功:', value))
  .catch(err => {
    console.log(err instanceof AggregateError); // true
    console.log(err.errors); // ['错误1', '错误3']
  });

四、Promise.race()

迭代器中的任何一个 Promise 被解决(fulfilled)或拒绝(rejected),就返回该 Promise。

其他传入的 Promise 仍然会继续执行,并不会被取消或中止,它们的最终结果会被忽略。

五、Promise.resolve()

  • 如果参数是 Promise 实例,直接返回原 Promise 实例
  • 如果参数不是 Promise(如普通值、对象等):返回一个以该值为成功结果的新的 fulfilled Promise。

六、Promise.reject()

  • 总是返回一个新的 rejected Promise,始终以传入的参数作为拒绝原因

    const resolvedPromise = Promise.resolve('成功'); // 新的 状态为 fulfilled 的 Promise
    const rejectedPromise = Promise.reject('失败'); // 新的 状态为 rejected 的 Promise

    resolvedPromise.then( // fulfilled Promise.then 执行第一个回调
    (value) => console.log('✅ onFulfilled 执行:', value), // ✅ onFulfilled 执行: 成功
    (reason) => console.log('❌ onRejected 执行:', reason) // 不执行
    );

    rejectedPromise.then( // rejected Promise.then 执行第二个回调
    (value) => console.log('✅ onFulfilled 执行:', value), // 不执行
    (reason) => console.log('❌ onRejected 执行:', reason) // ❌ onRejected 执行: 失败
    );

    rejectedPromise.catch( // .catch 只有一个回调
    (reason) => console.log('拒绝原因:', reason) // 拒绝原因: 失败
    );

七、Promise.withResolve

返回一个包含 promise 的对象,并带一个成功和一个拒绝

复制代码
//  可以轻松创建能外部控制的 Promise
const { promise, resolve, reject } = Promise.withResolvers();
// promise: Promise, resolve: function resolve, reject: function reject

八、传入空数组会发生什么

方法 空数组 [] 的结果 状态 说明
Promise.all([]) Promise {<fulfilled>: []} ✅ 立即成功 空真,安全
Promise.allSettled([]) Promise {<fulfilled>: []} ✅ 立即成功 空真,安全
Promise.race([]) Promise {<pending>} 永远挂起 危险!内存泄漏
Promise.any([]) Promise {<rejected>: AggregateError} ❌ 立即失败 All promises were rejected
Promise.resolve([]) Promise {<fulfilled>: []} ✅ 立即成功 包装为 Promise
Promise.reject([]) Promise {<rejected>: []} ❌ 立即失败 原因是空数组
Promise.withResolvers() 非数组方法 - 创建 {promise, resolve, reject}
相关推荐
aini_lovee2 小时前
C# 实现邮件发送源码(支持附件)
开发语言·javascript·c#
GISer_Jing2 小时前
ReAct规划原理实战指南
前端·react.js·ai·aigc
SoaringHeart2 小时前
Flutter组件封装:翻转组件 NFlipCard
前端·flutter
LlNingyu2 小时前
文艺复兴,什么是XSS,常见形式(一)
前端·安全·web安全·xss
英俊潇洒美少年3 小时前
js 进程与线程的讲解
javascript
dleei4 小时前
彻底淘汰老旧 SVG 插件:unplugin-icons 与 Tailwind CSS v4 自定义图标最佳实践
前端·程序员·前端框架
LlNingyu4 小时前
文艺复兴,什么是XSS,常见形式(二)
前端·安全·xss
汉堡大王95274 小时前
# AI 终于能"干活"了——Function Calling 完全指南
javascript·人工智能·机器学习
明君879974 小时前
说说我为什么放弃使用 GetX,转而使用 flutter_bloc + GetIt
前端·flutter