VUE如何优雅地判断依赖数据已经到位?

场景:某个页面(组件)中的ajax请求依赖某个参数,比如经纬度,我需要在经纬度已经获取到的情况下,才发起这个ajax请求。
比如:我先调用APP提供的定位接口,失败的话fallback到HTML5 geolocation,这个过程可能要2-3秒。

经纬度存在VUEX中

const state = {
  latitude: null,
  longitude: null
}

目前是created就显示loading,然后在页面(组件中)加了判断,定位有数据了就去请求ajax

computed: {
  isReady () {
    return this.$store.state.latitude && this.$store.state.longitude
  }
},
watch: {
  isReady () {
    this.fetchData()
  }
},
mounted () {
  if (this.isReady) {
    this.fetchData()
  }
}

有多个页面(组件)依赖经纬度,所以获取经纬度的方法我放在了App.vue中,SPA应用只需调用一次。

那么问题来了,我觉得目前watch的方法蛮傻的,有没有更加优雅的做法?

vue-cli + vue router + vuex

阅读 5.6k
4 个回答

获取经纬度的方法 应该返回的是promise吧, vuex的actions是可以封装异步逻辑的

第一步,把数据获取封装成promise,并做好缓存处理。
第二步,用现在流行的异步写法。
async function () {
let data = promise()
console.log(data)
}

把获取经纬度的操作(不管是直接读缓存还是走其它异步请求)封装成一个工具函数,返回promise对象。或者这个工具函数接收一个callback当做参数。
之后在要求经纬度的操作前调这个函数就可以了。

感谢大家解答,Promise确实要上的
自己研究了一番打算通过vue-router的钩子来检验数据,校验失败就不让进入页面了

beforeRouteEnter (to, from, next) {
  if (xxxx) {
    next()
  } else {
    next('XXX')
  }   
}

对VUE全家桶的认识还不够啊,边做边学

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题