当前位置: 首页 > ai >正文

Promise深入理解

 1.概念:

  • Promise是JS中处理异步操作的对象,它表示一个异步操作最终的完成状态(Pengding待定/fulfilled已兑现/rejected已拒绝)以及其结果值。
  • 它将处理阶段与异步操作最终结果关联起来→使异步方法像同步一样返回值→注意:返回为Promise对象(在某个时间点提供值)
  • 它可以让我们在不知道结果的情况下先拿一个占位符,等结果出来后再自动触发后续操作

1.2 创建Promise实例时传入一个函数作为参数,该函数又要传进去两个函数参数resolve和reject

  • resolve(value): 将Promise的状态由Pending转为fulfieed,并将value传递给.then()
  • reject(reason):将Promise的状态由Pending转为reject,并将reason传递.catch()
const myPromise = new Promise((resolve, reject) => {// 异步逻辑if (/* 成功 */) {resolve("Success!"); // 传参给 then} else {reject("Error occurred."); // 传参给 catch}
});

1.3Promise的常见方法:Promise.resolve(value)/Promise.reject(reason)/Promise.all(iterable)/Promise.race(iterable)

// 1.new Promise() ---> 创建Promise实例
// 注意:构造函数的代码是同步执行的
const promise = new Promise((resolve, reject) => {// 异步操作if (success) resolve(value); // 成功时调用 resolveelse reject(error);         // 失败时调用 reject
});// ----------------实例方法-----------------
// 2. .then()---> 用于处理Promise成功或失败的状态
promise.then(value => console.log('成功:', value),error => console.error('失败:', error)
);// 3. .catch()---> 用于处理Promise失败的状态
promise.catch(error => console.error('失败:', error));// 4. .finally()---> 用于处理Promise成功或失败的状态
promise.finally(() => console.log('完成'));// ------------静态方法------------------
// 5. Promise.all()--->接收一个 Promise 数组,所有 Promise 成功后才返回结果;只要有一个失败就立即 reject
const p1 = Promise.resolve(3);
const p2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo'));
const p3 = fetch('https://api.example.com/data');Promise.all([p1, p2, p3]).then(values => console.log(values)) // [3, "foo", response].catch(error => console.error(error));// 6.Promise.race(iterable) ---> 接收一个 Promise 数组,只要其中一个 Promise 完成(无论是成功还是失败),就立即返回该结果
Promise.race([p1, p2, p3]).then(data => console.log('请求成功:', data)).catch(err => console.error('请求失败:', err));

2.1同步代码:

  • 代码一行行执行,当前没执行完,下一行就必须等着;
  • 函数调用后立刻返回结果
function add(a, b) {return a + b;
}const result = add(2, 3); // 立即得到结果:5
console.log(result);      // 输出 5

2.2异步代码:

  • 某些操作需要等一段时间才能完成(如网络请求、读取文件、定时器)
  • 若直接返回结果,主线程会被阻塞
function fetchData() {setTimeout(() => {return "数据"; // ❌ 这个 return 不会传给外面的变量}, 1000);
}const data = fetchData(); // ❌ data 是 undefined
console.log(data);        // 输出 undefined

原因解析:

  • setTimeout若是同步的,1s后执行(阻塞主线程1s)→JS执行机制不允许等到这1S→异步编程出现的原因
  • fetchData()本身是同步的,立刻返回(默认返回undefined)→1s后拿到数据,但已无处接收

小疑惑:为啥调用后是undefined?

我们可以这样理解:它是一个声明的函数变量,但并未定义值,因此返回undefined

function foo() {// 没有 return
}console.log(foo()); // 输出: undefined

解决办法:调用fetchData返回一个promise,再通过.then方法获得结果值

function fetchData() {return new Promise((resolve, reject) => {setTimeout(() => {resolve("数据"); // 把结果交给 resolve}, 1000);});
}fetchData().then(data => {console.log(data); // ✅ 1秒后输出 "数据"
});

3.Async/await —— 是基于Promise的语法糖,使得异步代码的写法更加更加像同步

async function main() {const data = await fetchData(); // 看起来像同步写法console.log(data);              // 1秒后输出 "数据"
}

3.1 async函数:使用async关键字声明的函数,它调用之后会自动返回一个Promise对象

  • 自动包装成Promise,无论返回什么值,都会被Promise.resolve()
  • 只能在 async 函数内部使用 await
  • 支持 try...catch 错误处理

3.2 await: 暂停当前的执行,直到右侧的 Promise 被解决(fulfilled 或 rejected),然后返回其结果。

  • await fetchData()会等到网络请求完成;
  • 然后继续执行下一行;
  • 如果出错,可用try...catch捕获

4.执行顺序:无论是Promise还是async/await都属于微任务队列,优先级高于宏任务

http://www.xdnf.cn/news/12584.html

相关文章:

  • 【靶场】yzmcms5.3.0 SSRF漏洞
  • 分享一道力扣
  • 又是一年高考季
  • mariadb5.5.56在centos7.6环境安装
  • python怎么读shape文件?
  • GPU集群故障分析:大型AI训练中的硬件问题与影响
  • 408第一季 - 数据结构 - 字符串和KMP算法
  • 快速了解:单北斗终端的定义、作用与好处!
  • Qt(part 2)1、Qwindow(菜单栏,工具栏,状态栏),铆接部件,核心部件 ,2、添加资源文件 3、对话框
  • 随访系统安装的记录
  • 【Hot 100】84. 柱状图中最大的矩形
  • 数据库管理与高可用-MySQL高可用
  • 编程基础:执行流
  • Profinet转CanOpen网关模块:铝业车间通信“破壁者”,引领工业新变革
  • MS2691 全频段、多模导航、射频低噪声放大器芯片,应用于导航仪 双频测量仪
  • win32相关(IAT HOOK)
  • 【RTSP从零实践】1、根据RTSP协议实现一个RTSP服务
  • STM32什么是寄存器
  • 24、std::hash
  • conda环境配置(一) —— 常用虚拟环境操作命令
  • 新时代AI发展,更好的做自己
  • 第1讲、包管理和环境管理工具Conda 全面介绍
  • VB.net复制Ntag213卡写入UID
  • [C++] list双向链表使用方法
  • 深入理解 Java 多线程:原理剖析与实战指南
  • 乐观锁与悲观锁的实现和应用
  • 统一点云数据格式:高效转换与属性保留
  • 微服务架构的性能优化:链路追踪与可观测性建设
  • 基于Python学习《Head First设计模式》第六章 命令模式
  • PHP 表单 - 验证邮件和URL