Javascript 等待查询实时更新,然后返回值[Vuex,Firestore]

Javascript 等待查询实时更新,然后返回值[Vuex,Firestore],javascript,firebase,vue.js,google-cloud-firestore,vuex,Javascript,Firebase,Vue.js,Google Cloud Firestore,Vuex,我正在尝试等待Firestore实时查询的数据,然后执行其他操作。。 一切都按预期进行,我确实将数据表单firebase作为对象,但当我试图从返回的对象获取属性时,结果是空的 Vuex操作 export const getThreadMembers = async ({ commit,dispatch }, payload) => { try { let members = {} const threadMembersRef = await db

我正在尝试等待Firestore实时查询的数据,然后执行其他操作。。 一切都按预期进行,我确实将数据表单firebase作为对象,但当我试图从返回的对象获取属性时,结果是空的

Vuex操作

export const getThreadMembers = async ({ commit,dispatch }, payload) => {
      try {
        let members = {}
        const threadMembersRef = await db.collection('members')
                                  .doc(payload.threadId)

        threadMembersRef.onSnapshot(function(doc) {
          Object.assign(members,doc.data())
        })   
        /*
         * I've tried to add some delay before resolve the promise , i've succeeded to have the properties names of member Object
         *await dispatch('delay', 5000);
         */
        return Promise.resolve(members)
      } catch (error) {
        return  Promise.reject(error)
      }
    }
/*
 * this is a function for test purpose only
 */ 
export const delay = ({commit}) => {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve(42); // After 3 seconds, resolve the promise with value 42
    }, 3000);
  });
}
组件文件

      created () {
        this.getThreadMembers({
          threadId: this.threadId
        }).then(members => {
          // Here the Members value is an object
          //{bUNFP8ylLpSvZVdIUyOypQ9WfMB3: truej9R1VgexbZU2yp5q5icnIcIg5xB3: true__proto__: Object}
          console.log(members)
          // When i've tried to get only the key of members Object is always empty !?
          console.log(Object.getOwnPropertyNames(members))
         //[]length: 0__proto__: Array(0)

        })
      }
问题:


为什么
Object.getOwnPropertyNames(members)
members
之前执行?

onSnapshot的工作是异步的,但是现在它没有被处理,所以函数的其余部分只是继续,而不需要等待承诺的解决。使用
wait
是解决此问题的一种方法

    const doc = await threadMembersRef.onSnapshot()
    Object.assign(members,doc.data())
另外,您不需要在
threadMembersRef
上使用
wait
,因为它只是分配一个引用,不做任何工作

const threadMembersRef = db.collection('members')
                              .doc(payload.threadId)

感谢您的精彩解释,我已经尝试过了,但是我的控制台中出现了这个错误。请看这张图片,我使用了“firebase”:“^4.9.0”,我通过使用Promise对象包装函数来解决这个问题,
export const getThreadMembers=({commit,dispatch},payload)=>{return new Promise(function(resolve){let members={}const threadMembersRef=db.collection('members').doc(payload.threadId)threadMembersRef.onSnapshot(函数(doc){Object.assign(members,doc.data())resolve(members)}