为了账号安全,请及时绑定邮箱和手机立即绑定

调用组件时的竞争条件

调用组件时的竞争条件

慕田峪7331174 2022-05-26 16:52:17
我有 2 个组件正在加载到“应用程序”中,第一个组件通过进行 2 个 axios.get 调用将外部 IP 地址解析为地理地址,然后将它们(通过发射)返回给 App.vue。然后我调用“天气”来解析从前 2 次调用到由 darksky API 返回的那个 lat/long 的一些 json 的 lat/long。有时(50-60% 的时间)我遇到了一个竞争条件,我将 0/0 发送到天气(这是我在 App.vue 中初始化 lat/long 的内容)并且不知道如何解决它。我希望以下代码能够更可靠地运行。应用程序.vue<template>  <div id="app">        <img alt="Vue logo" src="./assets/logo.png">    <ip @response="onResponse" /> //Needs to finish before next line runs (has axios calls)    <Weather msg="The weather for:" :lat="lat" :long="long" :ip="ip" :city="city" :country="country"/>  </div></template><script>import Weather from './components/Weather.vue'import ip from './components/ip_resolve.vue'export default {  name: 'App',  data() {    return {      lat: 0,      long: 0,      ip: 0,      country: 0,      city: 0     }  },  components: {    Weather,    ip  },  //Accepts emitted values from ip_resolve -- needs to change values in data before Weather runs  methods: {    onResponse(event) {      this.lat = event.lat      this.long = event.long      this.ip = event.ip      this.country = event.country      this.city = event.city    }  }}</script>
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

通常,您会使用 vuex 之类的东西将此模型逻辑分离到自己的模块中,因此组件的数据流是完全单向的。


但在这种情况下,最简单的解决方案是在 App.vuev-if="responseReady"中向组件添加指令,<Weather>以便在数据准备好之前它不会被挂载。您还需要为这个新道具添加一个布尔标志到dataand onResponse。同样,这是快速而肮脏的解决方案。


  <Weather v-if="responseReady"  msg="The weather for:" :lat="lat" :long="long" :ip="ip" :city="city" :country="country"/>

...

  data() {

    return {

        lat: 0,

        long: 0,

        ip: 0,

        country: 0,

        city: 0,

        responseReady: false

      }

    }, 

...

    onResponse(event) {

      this.lat = event.lat

      this.long = event.long

      this.ip = event.ip

      this.country = event.country

      this.city = event.city

      this.responseReady = true;

    }


查看完整回答
反对 回复 2022-05-26
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号