异步执行转化为同步执行的方法

1.为什么要使用await和async

虽然异步操作可以跳过执行,继续执行下一步的操作,但是在很多地方,异步操作给我们带来了一些不便尤其是异步操作没有时序上的严格关系,例如发送请求的时候,很多时候不知道好久回复的相关请求,因此在某些时候,我们还是需要将异步操作修改为同步操作。例如在如下代码中我们就面临这异步的情况

如下代码的情况,我们在f2()中模拟了一个异步操作,但是f3中却要对f2中处理的数据进行判断,但是由于是异步情况,所以没法对在同步函数中处理异步函数发生的相关情况,因此下面这段代码的运行结果始终是   发送请求  登录失败 这种情况,因此这种情况下我们就需要将异步函数转化为同步函数

import { reactive } from 'vue';
export default {
  setup() {
    const ShowData = reactive({
      Number: 0,
      msg: ''      //模拟后端返回的数据
    })
    const f1 = function () {
      console.log('发送请求');
    }
    const f2 = async function () {
      // console.log(123123);
      // return 'hello world!   '
      setTimeout(() => {
        ShowData.msg = '登录成功'
      }, 500)
    }
    const f3 = function () {
      if (ShowData.msg === '') {
        console.log('登录失败');
      } else {
        console.log('登录成功');
      }
    }
    return {
      f1,
      f2,
      f3,
      ShowData
    }
  },
  mounted() {
    this.f1()
    this.f2()
    this.f3()
  }
}

2.定时器的使用-----治标不治本

其实无论是发送请求还是什么情况,如果是需要将异步操作转化为同步的时候,我们其实可以使用一个定时器,例如下面,将f3放在一个定时器中,推迟时间执行,就相当于将f3放入任务队列,就等f2执行完后在执行f3,虽然最后看似完成了需求,f2中修改了在f3中监测到了修改的值,但是其实这种方法是治标不治本,并没有在本质上解决这个问题。

import { reactive } from 'vue';
export default {
  setup() {
    const ShowData = reactive({
      Number: 0,
      msg: ''      //模拟后端返回的数据
    })
    const f1 = function () {
      console.log('发送请求');
    }
    const f2 = async function () {
      // console.log(123123);
      // return 'hello world!   '
      setTimeout(() => {
        ShowData.msg = '登录成功'
      }, 500)
    }
    const f3 = function () {
      if (ShowData.msg === '') {
        console.log('登录失败');
      } else {
        console.log('登录成功');
      }
    }
    return {
      f1,
      f2,
      f3,
      ShowData
    }
  },
  mounted() {
    this.f1()
    this.f2()
    setTimeout(()=>{
      this.f3()
    },1000)
  }
}

3.await和async的使用

其中的async可以将一个函数转化为异步函数,await就相当于等待异步函数执行完后再执行,如下这种情况,我们可以大致实现,等待异步函数执行完后再执行下一个函数。其实就大致的思路就是将待执行的同步函数转化为异步函数,并使用await,等待异步函数执行完后再执行下面。然后就大致可以将异步函数转化为同步函数。具体原理会在后续中继续更新。欢迎大家一起学习

<script>
import { reactive } from 'vue';
export default {
  setup() {
    const ShowData = reactive({
      Number: 0,
      msg: ''      //模拟后端返回的数据
    })
    const f1 = function () {
      console.log('发送请求');
    }
    const f2 = async function () {
      return new Promise(resolve => {
        setTimeout(()=>{
          ShowData.msg = '登录成功'
          resolve('我修改了msg')
        },2000)
      })
    }
    const f3 = async function () {
      console.log(123);
      await this.f2()
      console.log(ShowData.msg);
    }
    return {
      f1,
      f2,
      f3,
      ShowData
    }
  },
  mounted() {
    this.f1()
    this.f3()
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中,我们可以使用一些方法异步代码换为同步执行的代码。一种常见的方法是使用async/await关键字,它可以让异步代码看起来像同步代码一样运行。通过使用async关键字定义一个函数,我们可以在函数内部使用await关键字来等待异步操作的结果。这样可以确保异步操作在执行完成之前不会继续执行下面的代码。 下面是一个示例,演示了如何将一个异步的延迟函数delayAsync换为同步执行方法delaySync: ``` function delayAsync(ms) { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Done'); }, ms); }); } async function delaySync(ms) { try { const result = await delayAsync(ms); console.log(result); // 继续处理结果 } catch (error) { console.error(error); // 处理错误 } } delaySync(2000); ``` 在上面的示例中,delayAsync函数返回一个Promise对象,通过使用setTimeout函数模拟一个延迟操作。在delaySync函数中,我们使用await关键字等待delayAsync函数的结果,并在控制台打印出结果。通过这种方式,我们可以在代码中以同步的方式处理异步操作的结果。 需要注意的是,将异步方法换为同步执行方法应该谨慎使用。异步方法的非阻塞特性通常是其优势,所以只有在确实需要同步执行的情况下才应该进行换。在不必要的情况下,应避免将异步方法换为同步执行,以充分利用异步操作的性能优势。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JavaScript编程技巧:将异步方法换为同步执行的实用方法](https://blog.csdn.net/qq_39997939/article/details/131063612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值