如何在mounted生命周期中获取Vuex Action返回的Promise结果而非Promise本身?
问题根因
- Vuex 对
$store.dispatch()的实现做了内置封装:不管 action 内部返回什么内容,dispatch本身都会返回一个 Promise 实例,这个 Promise 被 resolve 时带出的值,就是对应 action 的返回结果。 - 你原有代码的逻辑错位在于:
console.log是同步执行语句,运行时会立刻拿到dispatch()返回的原始 Promise 对象并打印;而.then()中的回调属于微任务,要等到当前同步代码执行完、Promise 状态变更后才会触发,根本无法在同步打印的阶段拿到最终结果。 - 你写的
.then(res => res)没有起到任何实际作用,只是对值做了一层无加工的透传,完全没有改变 Promise 的异步执行特性。
正确实现方式
只要把打印逻辑移动到 Promise 的结果回调里,等真实值被 resolve 出来再执行打印即可,两种常用写法:
- 标准 Promise 链式写法
mounted() { this.$store.dispatch('myaction').then(res => { // 这里拿到的res就是action返回的实际值'foo' console.log(res) }) } - 更易读的 async/await 写法
如果你不喜欢链式调用的嵌套感,可以给 mounted 钩子加 async 标记,用 await 以同步风格获取异步结果:async mounted() { // await会直接取出Promise的resolve值,不需要额外写then回调 const result = await this.$store.dispatch('myaction') console.log(result) // 控制台直接输出'foo' }
注意:你当前在 action 里直接返回字符串的写法完全合法,不需要手动改成
return Promise.resolve('foo')之类的格式,Vuex 的内部机制会自动把 action 的返回值包装成可被 then/await 捕获的 Promise 结果。
内容的提问来源于stack exchange,提问作者DevonDahon
相关产品推荐
相关产品推荐

