• promise在实际的项目中解决的问题


    背景:

    一个页面需要同时校验两个表单,都校验成功之后才能执行发送,同时校验,且同时提示哪里填写出错,所以直接promise.then的链式调用、async await(任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行)、 和普通的回调函数都无法实现,所以用到了promise.all 

    Promise.all(iterable) (iterable 可迭代的),并且只返回一个Promise实例

    此实例在 iterable 参数内所有的 promise 都完成(resolved)如果参数中 promise 有一个失败(rejected),此实例回调失败(reject)

    为了清晰展示怎么使用,由于实际项目vue编写且业务复杂,把promise.all 从项目抽离出来简化了一下,以 index.html 简化出来,放到html里面,是为了可以直接浏览器允许,立马展示运行效果

    html文件:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Promsie</title>
    </head>
    
    <body>
      <script>
        function validate1() {
          return new Promise((resolve, reject) => {
            if (this.flag) {
              setTimeout(() => { resolve('校验1') }, 3000)
            } else {
              reject('校验失败')
            }
    
          })
        }
        function validate2() {
          return new Promise((resolve) => {
            setTimeout(() => { resolve('校验2') }, 1000)
          })
        }
        function send() {
          const promiseList = [this.validate1(), this.validate2()]
          // Promise.all 全都成功返回,否则error
          // Promise.allSettled 都执行完之后返回p对象对应的promise结果  例:{reason: "校验失败"status: "rejected"}
          // Promise.any 当其中的一个 promise 成功,就返回那个成功的promise的值。
          // Promise.race 一旦迭代器中的某个promise成功(解决)或拒绝,返回的 promise就会成功(解决)或拒绝 就是谁请求的速度快,先返回谁,无论失败与否
          Promise.all(promiseList)
            .then((res) => { console.log(res) })
            .catch(() => console.log('promise--error'))
            .finally(() => console.log('无论结果怎样,结束了都走这'))
        }
    
        this.send()
      </script>
    </body>
    
    </html>

     注意: promise 执行了.then 又执行了.cantch的原因

     Promise会自动捕获内部异常,并交给rejected响应函数处理。

     .then函数中如果有异常代码,哪怕编辑器不报错。Promise会自动捕获内部异常,就会造成不仅执行了.then函数又执行了.catch函数的现象。

  • 相关阅读:
    多种支付实现(只需要添加, 修改类方法)
    事务的隔离级别 另一种事务开启方式
    序列化类补充 source关键字参数 SerializerMethodField方法
    分类的数据处理 第一种递归处理,第二种树型结构 无极限分类
    数据库补充 navicate导入与导出
    微信小程序开发5 后端解析wx.getUserInfor中的用户信息, 微信小程序支付
    微信小程序开发4 登录与授权
    微信小程序开发3 自定义组件(传参), 页面跳转(传参), 小程序本地存储, 小程序向django请求接口
    前八后十六节奏
    [编织消息框架][JAVA核心技术]动态代理应用11-水平扩展实现
  • 原文地址:https://www.cnblogs.com/imMeya/p/14714540.html
Copyright © 2020-2023  润新知