我无法使用VueJS,axios,Async / Await和Promise(??)从REST-API检索数据。 我需要调用两个不同的REST-API。一个是给我一个列表,我可以迭代它,这很好。
<template>
<div>
<div v-if="posts && posts.length">
<div v-for="post of posts">
{{post.name}}
<img :src="getUserPicturePath(post.name)" />
</div>
</div>
</div>
</template>
另一个,正如你所看到的,在v-for之间,正在调用一个使用axios的方法。
<script>
import axios from 'axios'
export default {
data: () => {
posts: []
}
created() {
// a method to fill up the post-array
},
methods: {
async getUserPicturePath(name){
const response = await axios.get('linkToApi'+name)
console.dir(response.data.profilePicture.path)
return response.data.profilePicture.path
}
}
}
</script>
console.dir(response.data.profilePicture.path)
- 部分正在为profilePicture提供正确的路径,但<img :src="getUserPicturePath(post.name)" />
上面的<template>
会写[Object Promise]
。
我有什么建议可以走这条路吗?
答案 0 :(得分:1)
Vue无法解析属性中的Promise,因此您必须执行类似的操作。
模板
<div v-for="post of posts">
...
<img :src="post.profilePicture" />
...
JavaScript
export default {
created() {
this.posts = ...
await Promise.all(this.posts.map(async post => {
post.profilePicture = await this.getUserPicturePath(post.name);
}));
}
}
答案 1 :(得分:-2)
你可以选择
<template>
...
<img :src="img_path" v-if="img_path">
...
</template>
<script>
...
data() {
...
img_path: "",
img: "userImg.png"
}
// or however you wish to pass user image and trigger loading
create() {
this.getUserPicturePath(this.img)
},
methods: {
getUserPicturePath(name){
axios.get('getImage/'+name)
.then(response => {
this.img_path = response.data.path
console.dir(response.data.path)
})
.catch(error =>{
// ... error
})
},
}