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

【2023-3-29】JavaScript使用promise顺序调用函数并抛出异常

JavaScript使用promise顺序调用函数并抛出异常

场景

新建或者编辑时,一个页面中存在多个表单,每个表单都有单独进行表单验证。点击提交时,若有一个表单校验失败,则不能提交。
ps:为啥不放在一个表单中?
(⊙o⊙)…旧项目改造,业务实现中存在嵌套在多个折叠面板中的form表单,且部分表单验证会影响后续表单的验证

实现思路

可以使用 Promise 的链式调用来实现这个功能。即在前一个函数的then回调中调用后一个方法,最后通过catch抛出错误。

具体示例

<script>
  function validateMethod1() {
    return new Promise((resolve, reject) => {
      // 验证方法一的代码
      let temp1 = Math.random() * 10
      console.log('temp1', temp1)
      const isValid = temp1 > 5; // 假设验证方法一通过

      if (isValid) {
        resolve();
      } else {
        reject(new Error("验证方法一失败"));
      }
    });
  }

  function validateMethod2() {
    return new Promise((resolve, reject) => {
      let temp2 = Math.random() * 10
      console.log('temp2', temp2)
      // 验证方法二的代码
      const isValid = temp2 > 6; // 假设验证方法二通过

      if (isValid) {
        resolve();
      } else {
        reject(new Error("验证方法二失败"));
      }
    });
  }

  validateMethod1()
    .then(() => validateMethod2())
    .then(() => {
      console.log("两个方法都验证通过了");
    })
    .catch((error) => {
      console.error(error.message);
    });
</script>

上面的代码中,先定义了两个验证方法 validateMethod1 和 validateMethod2,它们都返回 Promise 对象。在 Promise 链式调用中,先调用 validateMethod1,如果验证通过就继续调用 validateMethod2,最后在链式调用的最后一个 then 方法中输出成功信息。如果在验证方法中出现错误,则会被捕获并输出错误信息。

为什么每一个方法中都需要return一个promise?

是的,每一个方法都需要返回一个 Promise 对象。Promise 是 JavaScript 中的一种异步编程解决方案,可以很好地处理异步代码的执行顺序和结果传递等问题。

在上面的例子中,validateMethod1 和 validateMethod2 都返回了一个 Promise 对象,并在验证通过时调用 resolve 方法,在验证失败时调用 reject 方法,并传入一个错误对象。这样,在链式调用中,当一个方法验证通过时,就会继续执行下一个方法,如果有一个方法验证不通过,就会在链式调用中捕获到错误并输出错误信息。

如果一个方法没有返回 Promise 对象,就无法使用 Promise 链式调用来串联多个方法。因此,每一个方法都需要返回一个 Promise 对象,以便能够使用 Promise 链式调用来实现方法的调用和验证。

补充:

上述示例只是一个简单的实现思路,不代表具体业务逻辑。

问题场景存在局限性,仅作为自身解决问题的记录


http://www.kler.cn/a/5368.html

相关文章:

  • Nature Electronics——近传感器计算:50 nm异构集成技术的革命
  • Web应用安全-漏洞扫描器设计与实现
  • 数据结构:LinkedList与链表—面试题(三)
  • [python3]Excel解析库-xlwt
  • STM32-笔记34-4G遥控灯
  • 并行云使用流程
  • 第十二届蓝桥杯JavaB组省赛题解
  • Redis基本语法
  • [Rust GUI]fltk-rs的helloworld
  • 立体声骨传导蓝牙耳机哪款好一点,分享几款优秀的骨传导耳机
  • ubuntu22.04 服务器 SSH 密钥登录失败
  • Golang引入chatGPT
  • P2573 [SCOI2012]滑雪
  • Facebook多账号运营怎么防关联?
  • 显卡驱动一定要更新吗?怎么更新显卡驱动?
  • k8s之command、args 与 CMD、ENTRYPOINT的对应关系
  • 【H3C】VRRP2 及Vrrp3基本原理 华为同用
  • 【目标检测】---- YOLOX 旷视2021
  • 干货 | 关于逆变器,这些小知识你都了解么?
  • 给大家讲个笑话,拿了个offer,因为体检查出脂肪肝,公司把我拒绝了!
  • 用Owncast构建直播服务器
  • vue中的数据代理、
  • 积性函数及其初级应用
  • 秒懂算法 | 基于主成分分析法、随机森林算法和SVM算法的人脸识别问题
  • [技术杂谈]小米手机如何将锁屏快捷方式放桌面
  • 《安富莱嵌入式周报》第306期:开源独轮车,Cortex-M85修订版r1发布,Terathon图形数学库,不断变革的IDE开发环境,各个厂家总动员