(四)前端,如此简单!---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}
相关推荐
自信的未来2 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
SRET2 小时前
Mineradio 沙盒隔离安装完全指南 | 一键安全运行 Electron 应用!!!
javascript·经验分享·安全·electron·aigc·音视频·ai编程
全栈前端老曹2 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
zhangxingchao3 小时前
AI大模型核心八:从 Agent Skill、长文档 RAG 到知识库更新与训练策略
前端·人工智能·后端
zhangxingchao3 小时前
AI大模型核心七:从 Workflow、RAG、记忆治理到幂等性
前端·人工智能·后端
gyx_这个杀手不太冷静4 小时前
Agent开发进阶指南(第 1 章):AI Agent 到底是什么?
前端·agent·ai编程
小小小小宇4 小时前
模型相关知识
前端
小小小小宇4 小时前
模型相关知识二
前端
IT_陈寒5 小时前
Python装饰器竟然偷偷改了函数名?这个坑我爬了三天
前端·人工智能·后端
free355 小时前
作用域链与 Environment:变量查找、遮蔽和赋值怎么实现
javascript