【问题标题】:Firebase Firestore returns a promise in VueFirebase Firestore 在 Vue 中返回一个 Promise
【发布时间】:2020-08-24 15:29:50
【问题描述】:

我正在尝试使用来自 Firestore 的一些数据。在它以前工作之前,现在在 Vuetify 中,如果我尝试访问 $data.users,我会一直收到“PENDING”

    export default {
  data() {
    return {
      users: [],
    };
  },
  created() {
    db.collection('users').get().then((snapshot) => {
      snapshot.forEach((doc) => {
        const user = doc.data();
        user.id = doc.id;
        this.users = user;
        console.log(user.documents.selfie.url); // Here the log return the value correctly
      });
    });
  },
  methods: {
    imageUrl(user) {
      console.log(user.documents.selfie.url); // Here the log return "Pending";
    },

在模板中我运行v-for (user, index) in users :key='index'

错误:

Uncaught (in promise) TypeError: Cannot read property 'selfie' of undefined

【问题讨论】:

  • 在 v-for 检查之前 v-如果您的数据已设置并使用 user.documents.selfie.url || 'http://example.com/to/default.jpg'

标签: firebase vue.js google-cloud-firestore vuetify.js


【解决方案1】:

如果不重现您的问题,很难 100% 确定,但我认为问题出在这样一个事实,即当您调用 imageUrl() 方法时,异步 get() 方法返回的 Promise 还不是 fulfilled。这就是您获得 pending 值的原因。

解决这个问题的一种可能性是检查如下:

  methods: {
    imageUrl(user) {
      if (user) {
         console.log(user.documents.selfie.url);
      } else {
         //...
      }
    },

另外,您似乎想用来自users 集合的文档填充用户数组。你应该这样做:

  created() {
    db.collection('users').get().then((snapshot) => {
      let usersArray = [];
      snapshot.forEach((doc) => {
        const user = doc.data();
        user.id = doc.id;
        usersArray.push(user);
        console.log(user.documents.selfie.url); // Here the log return the value correctly
      });
      this.users = usersArray;
    });
  },

使用您当前的代码,您分配循环中的最后一个用户,而不是用户列表。

【讨论】:

  • 谢谢@renaud。它越来越好,至少现在我没有破坏所有组件。但是,如果调用该方法时图像没有加载怎么办?我怎么能在 else 块中解决这个问题?
  • 最好在 created 钩子中调用 then() 方法中的方法。您还可以使用与上述类似的 if then else 计算值,并且正如您所提到的,您可以管理图像尚未加载到 else 中的情况(例如,显示默认图像)。您也可以使用watcher。这完全取决于您的具体情况!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 2019-01-27
  • 1970-01-01
  • 2020-03-31
  • 2019-09-17
  • 1970-01-01
相关资源
最近更新 更多