Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • CSS

  • JavaScript

    • 兼容ie7的水平无限滚动
    • 节流防抖
    • 数组乱序
    • 开启全屏
    • 数据类型
    • 变量提升
    • this调用指向
    • 原型及原型扩展
    • js获取元素属性精度问题
    • setTimeout和setInterval
    • 数组判断
    • dom节点添加或插入元素
    • var、let和const的区别
    • 判断ellipsis是否省略生效
    • 使用ResizeObserver监听元素size变化
    • js自定义事件
    • use strict详解
    • 私有属性
    • js实现类的方式
    • call和apply的理解和使用
    • js失焦和点击事件顺序冲突
    • js中不常见但非常实用的运算符
    • for of和for in的区别
    • defer和async的区别
    • promise值穿透
    • js为什么会出现数字精确度丢失
    • js禁用F12开发者模式
    • 使用scrollTop和scrollTo滚动到目标位置
    • js实现打字机效果
    • 多种方式实现数组去重
    • 替换使用setTimeout
    • encodeURI和encodeURIComponent的区别
    • canvas实现弹跳小球
    • js实现跨标签页通信
    • 事件循环与微任务、宏任务
    • 浏览器存储数据方式
    • 常见的meta元数据使用
    • 使用InterSectionObserver判断元素区域(chatGPT)
  • 工具

  • Vue

  • antdv踩坑记录

  • Vue3

  • 前端
  • JavaScript
kros
2024-05-08

promise值穿透

在JavaScript中,Promise的“值穿透”(Value Chaining)是指在Promise链中,通过.then()方法返回的值可以被链中的下一个.then()函数接收的特性。这意味着你可以在Promise链中传递值,并且每个.then()函数都能访问到前一个.then()函数返回的值。

const promise1 = Promise.resolve(1);

promise1
  .then(result => {
    console.log(result); // 输出: 1
    return result + 1;
  })
  .then(result => {
    console.log(result); // 输出: 2
    return result + 1;
  })
  .then(result => {
    console.log(result); // 输出: 3
  });
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在这个例子中,每个.then()函数返回一个新的值,并且这个值被传递给链中的下一个.then()函数。

# 值穿透的规则

  1. 返回值:每个.then()函数的返回值会成为下一个.then()函数的参数。

  2. 隐式解析:如果.then()函数返回一个值,那么这个值会被自动包装在一个新的Promise对象中,并且这个Promise对象会被解析为这个返回值。

  3. 返回Promise:如果.then()函数返回一个Promise对象,那么链中的下一个.then()函数将等待这个Promise对象解析或拒绝后再执行。

  4. 非值返回:如果.then()函数没有返回值(或者返回undefined),那么下一个.then()函数的参数将是undefined。

  5. 错误传递:如果.then()函数中抛出错误,那么链中的下一个.then()函数将不会执行,而是跳转到链中的.catch()方法(如果有的话)来处理错误。

# 使用async/await的值穿透

在async/await语法中,值穿透的行为与.then()类似,但是更加简洁和直观。

async function example() {
  const result1 = await promise1; // result1为1
  const result2 = await result1 + 1; // result2为2
  const result3 = await result2 + 1; // result3为3
  console.log(result3); // 输出: 3
}

example();
1
2
3
4
5
6
7
8

在这段代码中,await关键字用于等待Promise解析,并且解析后的值可以被直接使用。

# 总结

值穿透是Promise链式调用的一个关键特性,它允许你在Promise链中传递值,并且使得异步操作的流程控制更加灵活和方便。无论是使用.then()方法链,还是使用async/await语法,都可以通过值穿透来实现复杂的异步流程。

上次更新: 2025/09/05, 8:09:00
defer和async的区别
js为什么会出现数字精确度丢失

← defer和async的区别 js为什么会出现数字精确度丢失→

最近更新
01
Find the next perfect square
09-05
02
Regex validate PIN code
09-05
03
Find the odd int
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 kros king
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev