You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js调用loadUserId()后data中userId字段未初始化问题

问题原因

核心原因是axios发起的网络请求是异步非阻塞的,你当前的代码没有等待loadUserId()中的请求完成、给this.userId赋值,就直接执行了后续取this.userId发第二个请求的逻辑,此时this.userId还是初始的空字符串,自然传参为空。
实际代码执行顺序如下:

  • created钩子触发,调用loadComponentsOfUser()
  • loadComponentsOfUser()内部调用loadUserId(),发起第一个获取用户ID的网络请求,该请求进入异步任务队列,不会阻塞后续同步代码执行
  • 同步代码继续往下走,立刻发起第二个请求users/ + this.userId,此时第一个请求还没返回,this.userId仍为空值
  • 等第一个请求拿到返回值、执行then回调给this.userId赋值时,第二个请求早就已经发出去了。

另外你代码里还有个语法错误:methods():是错误写法,正确写法是methods: { ... },多写的括号和冒号会导致语法报错,记得一并修正。

修复方式

方案1:使用async/await 等待异步请求执行完成

给两个异步方法加上async标记,调用loadUserId()时加await等待请求返回、赋值完成后,再执行第二个请求,参考代码:

data() {
  return { 
    userId: ''
  }
},

created() {
  this.loadComponentsOfUser()
},

methods: {
   async loadUserId() {
     try {
       const res = await axios.get('getUserId')
       this.userId = res.data
     } catch (err) {
       // 原有错误处理逻辑
     }
   },
   async loadComponentsOfUser() {
     // 等待用户ID加载、赋值完成
     await this.loadUserId()
     try {
       const res = await axios.get(`users/${this.userId}`)
       // 原有处理用户组件数据的逻辑
     } catch (err) {
       // 原有错误处理逻辑
     }
   }
}

方案2:在Promise的then回调中执行依赖请求

让loadUserId()返回axios请求实例,在其then回调里确认userId赋值完成后,再发起第二个请求,无需async/await也可实现:

data() {
  return { 
    userId: ''
  }
},

created() {
  this.loadComponentsOfUser()
},

methods: {
   loadUserId() {
     return axios.get('getUserId').then(res => {
       this.userId = res.data
     }).catch(() => {
       // 原有错误处理逻辑
     })
   },
   loadComponentsOfUser() {
     this.loadUserId().then(() => {
       // 此时userId已经完成赋值,再发第二个请求
       axios.get(`users/${this.userId}`).then(res => {
         // 原有处理用户组件数据的逻辑
       }).catch(() => {
         // 原有错误处理逻辑
       })
     })
   }
}

内容的提问来源于stack exchange,提问作者Lyubushkino Soglasie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:15:34