【问题标题】:How to simplify this function in Vuex如何在 Vuex 中简化此功能
【发布时间】:2020-02-27 18:29:16
【问题描述】:

我需要一些方法来简化这个异步调用,我可以将快照作为一个数组返回,而不必像示例中那样创建一个数组?谢谢

编辑:以下示例中的异步调用正常工作,但我想在不声明数组的情况下简化该调用。

  actions: {
    getUsers: async function({ commit }) {
      try {
        const snapshot = await db.collection("users").get()
        var array = [];
        snapshot.forEach(doc => {
          array.push(doc.data());
        });
        commit("loadUsers", array);
      } catch (error) {
        console.log(error);
      }
    },
  },

示例:commit("loadUsers", snapshot);

【问题讨论】:

  • 是否应该有 try..catch 取决于你的情况。调用者调度一个动作但不知道它是否成功是可取的吗?
  • 我稍后会修复它,我只是将它用于提出问题的示例

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


【解决方案1】:

snapshot 是一个QuerySnapshot 类型的对象。由于它在名为 docs 的数组类型字段中公开生成的文档,因此您可以使用它从每个文档中创建一个数据对象数组:

const array = snapshot.docs.map(doc => doc.data());
commit("loadUsers", array);

不过,它并没有真正变得更有效率。它们是大致等价的代码。

【讨论】:

  • 这个例子有效,谢谢。而是一个问题。像下面这样的东西? const snapshot = await db.collection("users").get().then(function() { return snapshot.docs.map(doc => doc.data()); });提交(“加载用户”,快照);
  • 这两种方式都不是 .then(function() { return snapshot.docs.map(doc => doc.data()); }).then( commit("loadUsers", snapshot) )
  • @RipperNoChart 那是因为snapshot 是在您尝试在then 中访问它之后分配的。只是不要将then 与async 一起使用。 async..await 是 then 的语法糖,应该替换它。
  • 我很好,我要跳 iinioomluklojkjk 到 ijjill。 ... pp
猜你喜欢
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多