【发布时间】:2019-05-31 09:32:02
【问题描述】:
这是我孩子的组件异步方法:
async created () {
this.$parent.$emit('loader', true)
await this.fetchData()
this.$parent.$emit('loader', false)
}
fetchData 执行 axios get 调用,从 API 获取数据。但是,在 vue-devtools(事件选项卡)中,我只能在更改代码并热重新加载后才能看到事件。我还在父组件中设置了console.log():
mounted() {
this.$on('loader', (value) => {
console.log(value)
})
}
我只能在控制台中看到false。我的目的是将加载器设置为 true(以便我可以显示加载器),然后在获取数据时将其设置为 false。
我的 fetchData 方法:
import http from '@/http'
fetchData() {
return http.getOffers().then((resp) => {
this.offersData = resp.data
})
}
http.js 的内容:
import axios from 'axios'
import config from '@/config'
const HTTP = axios.create({
baseURL: config.API_URL
})
export default {
/* calculator */
getOffers() {
return HTTP.get('/url')
}
}
如果我在async created() 中直接使用return axios.get(),那么它可以工作。问题出在这个导入的 http 实例中。
最终解决方案
其中一个问题是使用不同的生命周期,感谢Evan 提到这一点。
另一个问题是 async / await 的使用,更改为 fetchData() 方法:
import http from '@/http'
async fetchData() {
await http.getOffers().then((resp) => {
this.offersData = resp.data
})
}
我必须使这个方法异步并在 axios 请求上使用 await,因为 await 是 thenable,它确实有效。我还在 https.js 中发现了一个问题:
export default {
/* calculator */
getOffers() {
return HTTP.get('/url')
}
}
它返回HTTP.get(),而不是一个承诺本身,我可以在这里使用then,它会起作用,但是,出于灵活性的目的,我没有这样做。
但是,我仍然不明白为什么它不起作用:
fetchData() {
return http.getOffers().then((resp) => {
this.offersData = resp.data
})
}
它不是已经返回了一个承诺,因为它与 then 链接在一起......所以令人困惑。
再次重新测试,似乎return 工作正常,哈哈。
【问题讨论】:
-
异步方法中的
console.log(this)是否返回 Vue 对象或承诺? -
你能创建一个 JSFiddle 吗?
-
@KubwimanaAdrien,我刚刚做了
console.log(this)而不是console.log(value)并得到了Vue 对象。 -
小心
.catch。 这将抑制您在.then回调中获得的所有错误。最好在 .then 的第二个参数中执行:axios.get('/url').then((resp) => {}, (err) => {})infographic
标签: javascript vue.js