zoukankan      html  css  js  c++  java
  • 异步ajax请求之间可能会有依赖情况,本篇以定时器模拟请求,总结了几种通过async await和Promise将异步转为同步的方案

    异步ajax请求之间可能会有依赖情况,本篇以定时器模拟请求,总结了几种通过async await和Promise将异步转为同步的方案

    // get1请求、get2请求
    function get1 () {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          num1 += 1
          console.log('get1执行')
          resolve(num1)
        }, 2000)
      })
    }
    function get2 () {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          num2 += 2
          console.log('get2执行')
          resolve(num2)
        }, 1000)
      })
    }
    

    1.异步请求,无依赖

    get1 ()
    get2 ()
    // get2执行 get1执行
    

    2.Promise.all():get3依赖get1和get2,get1和get2之间异步执行

    Promise.all([get1(), get2()]).then((data) => {
      console.log(data)
    })
    // get2执行 get1执行 [1, 2]
    
    then的函数体会在get1和get2的回调完成后执行,参数data是get1和get2的resolve()参数值组成的数组
    
    3.get3依赖get1和get2,且get1和get2同步执行

    方案1:async await:

    async function get3 () {
      await get1()
      await get2()
      console.log(num1 + num2)
    }
    get3() // get1执行 get2执行 3
    
    get3函数体会在get1和get2回调执行完执行
    get1和get2同步执行,即get2会等get1回调执行后开始执行
    

    方案2:Promise.all() await

    async function get3 () {
      Promise.all([await get1(), await get2()]).then((data) => {
        console.log(data)
      })
    }
    get3() // get1执行 get2执行 [1, 2]
    

    .get3依赖get1和get2,get1和get2有一个进入catch,阻塞get3

    async function get3 () {
      let get1Flage = await get1().catch(() => {
        return false
      })
       if (!get1Flage) {
        return // 不再继续执行
      }
      let get2Flage = await get2().catch(() => {
        return false
      })
      if (!get2Flage ) {
        return // 不再继续执行
      }
      console.log(num1 + num2)
    }
    
    确保只有get1和get2都成功才会执行get3
    

    来源:https://blog.csdn.net/qq_37246828/article/details/89478818

    参考:https://www.jianshu.com/p/3457a7ab4afb

  • 相关阅读:
    PSFTP使用简单教程
    JavaMail应用--通过javamail API实现在代码中发送邮件功能
    java常用数据类型转换
    自己封装的Java excel数据读取方法
    java怎样实现重载一个方法
    怎样做好测试保证交付产品质量
    软件测试之测试用例颗粒度问题
    Python 一句命令启动一个web服务器
    ansible 模块之在学习--lineinfile
    centos 7 安装sql 审核工具 inception + archer
  • 原文地址:https://www.cnblogs.com/xqschool/p/13995093.html
Copyright © 2011-2022 走看看