Javascript 等待查询实时更新,然后返回值[Vuex,Firestore]
我正在尝试等待Firestore实时查询的数据,然后执行其他操作。。 一切都按预期进行,我确实将数据表单firebase作为对象,但当我试图从返回的对象获取属性时,结果是空的 Vuex操作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
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)}