在Vuejs中异步并等待

时间:2017-08-08 09:29:29

标签: rest promise vue.js async-await axios

我无法使用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]

我有什么建议可以走这条路吗?

2 个答案:

答案 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
                })                
        },        
   }