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

【Javascript】Promise形象比喻

我们可以把 Promise 形象地比喻为一个“外卖订单”,它有三种状态:下单中、已送达、已取消。这个比喻可以帮助你理解 Promise 的工作机制。

比喻解释

Pending(下单中):

当你在外卖平台上创建一个订单时,订单状态是“下单中”。此时,外卖还没有送达,也没有取消,你在等待外卖的处理结果。
对应于 Promise,刚创建时的状态就是 Pending

Fulfilled(已送达):

当外卖小哥把你的餐送到并交给你时,订单状态变为“已送达”。你得到了你期望的结果,可以开始享用美食。
对应于 Promise,被 resolve 时的状态是 Fulfilled,这时你可以在 .then 方法中处理结果。

Rejected(已取消):

如果外卖因为某些原因(例如餐厅关闭或配送问题)被取消了,订单状态变为“已取消”。你没有得到你期望的餐,并可能需要处理退款或其他问题。
对应于 Promise,被 reject 时的状态是 Rejected,这时你可以在 .catch 方法中处理错误。

示例解释

// 创建一个外卖订单(Promise)
const orderFood = new Promise((resolve, reject) => {// 模拟外卖处理过程setTimeout(() => {const isDelivered = Math.random() > 0.5; // 50% 概率送达,50% 概率取消if (isDelivered) {resolve('外卖已送达'); // 订单成功} else {reject('外卖已取消'); // 订单失败}}, 2000); // 模拟 2 秒的送餐时间
});// 处理订单结果
orderFood.then(message => {console.log(message); // 外卖已送达}).catch(error => {console.error(error); // 外卖已取消});

在这个示例中:

当你创建 orderFood 这个 Promise 对象时,订单状态是“下单中”(Pending)。
经过 2 秒的模拟送餐时间,订单状态会变成“已送达”(Fulfilled)或者“已取消”(Rejected),并分别调用相应的回调函数处理结果。

链式调用的比喻

你可以想象链式调用 .then 和 .catch 像是处理外卖订单过程中的一系列步骤。例如,确认送达后可以继续处理支付和评价步骤:

orderFood.then(message => {console.log(message); // 外卖已送达return '确认支付';}).then(paymentMessage => {console.log(paymentMessage); // 确认支付return '给好评';}).then(reviewMessage => {console.log(reviewMessage); // 给好评}).catch(error => {console.error('处理失败:', error); // 处理失败,例如外卖已取消});

在这个扩展的比喻中,每个 .then 都是订单流程中的一个步骤,只有前一步成功完成,下一步才会继续进行。如果某一步失败(例如外卖被取消),错误处理(.catch)就会被触发,处理相应的错误情况。


项目中的运用

其实是最近在写一个后台管理项目,我喜欢用.then.catch

<script setup lang="ts">
import { User, Lock } from "@element-plus/icons-vue";
import { reactive, ref } from "vue";
import { useRouter } from 'vue-router'
import { ElNotification } from "element-plus";
//引入用户相关的小仓库
import useUserStore from "@/store/modules/user";
let useStore = useUserStore()//定义变量控制按钮加载效果
let loading = ref(false)
//获取路由器
let $router = useRouter()
//收集账号与密码的数据
let loginForm = reactive({ username: '', password: '' })//登录按钮回调
const login = () => {//按钮加载效果loading.value = true//通知仓库发登录请求//请求成功->首页展示数据的地方//请求失败->弹出登录失败的信息useStore.useLogin(loginForm).then(() => {//编程式跳转到数据首页$router.push('/')//登录成功提示信息ElNotification({type: 'success',message: '登录成功'})//登录成功加载效果消失loading.value = false}).catch((error) => {//登录失败加载效果消失loading.value = falseElNotification({type: 'error', message: error.message})})
}
</script>

当然,用try...catch可能是一个更好的选择

// 登录按钮回调
const login = async () => {// 按钮加载效果loading.value = true;try {// 通知仓库发登录请求await useStore.useLogin(loginForm);// 编程式跳转到数据首页$router.push('/');// 登录成功提示信息ElNotification({type: 'success',message: '登录成功'});} catch (err) {// 使用类型断言确保 err 是 Error 类型const error = err as Error;// 登录失败提示信息ElNotification({type: 'error',message: error.message || '登录失败'});} finally {// 登录成功或失败加载效果消失loading.value = false;}
};

相关文章:

  • Java的逻辑控制和方法的使用介绍
  • springboot+minio 文件上传
  • 【随笔4】心情——复杂
  • 一个普通双非女生的秋招之路
  • 轻松学EntityFramework Core--Entity Framework Core 简介
  • 重生之 SpringBoot3 入门保姆级学习(06、属性绑定)
  • c语言如何向文件写入字符串
  • PTA 判断两个矩阵相等
  • 【白盒测试】单元测试的理论基础及用例设计技术(6种)详解
  • ubuntu下交叉编译安卓FFmpeg 和 官方指导链接
  • Python筑基之旅专栏(导航)
  • 【MySQL精通之路】InnoDB(6)-磁盘结构
  • LeetCode题练习与总结:将有序数组转换为二叉搜索树--108
  • YoloV9改进策略:卷积篇|使用PConv替换YoloV8中的卷积|即插即用,简单高效
  • 【MySQL精通之路】InnoDB(18)-备份与恢复
  • 分享一款快速APP功能测试工具
  • Android开源项目规范总结
  • CSS中外联样式表代表的含义
  • JavaScript DOM 10 - 滚动
  • Java精华积累:初学者都应该搞懂的问题
  • java中具有继承关系的类及其对象初始化顺序
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • nfs客户端进程变D,延伸linux的lock
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Webpack 4 学习01(基础配置)
  • 阿里研究院入选中国企业智库系统影响力榜
  • 前端路由实现-history
  • 设计模式 开闭原则
  • 设计模式(12)迭代器模式(讲解+应用)
  • 移动端 h5开发相关内容总结(三)
  • Java性能优化之JVM GC(垃圾回收机制)
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 通过调用文摘列表API获取文摘
  • (C11) 泛型表达式
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (vue)页面文件上传获取:action地址
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (六)软件测试分工
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .JPG图片,各种压缩率下的文件尺寸
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Reactor简单使用教程
  • .net web项目 调用webService
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net反混淆脱壳工具de4dot的使用
  • .net访问oracle数据库性能问题
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @NotNull、@NotEmpty 和 @NotBlank 区别
  • @Transient注解
  • []串口通信 零星笔记
  • [100天算法】-x 的平方根(day 61)