【发布时间】:2019-04-12 16:49:45
【问题描述】:
我有一个带有 userIDs 的 convos 对象,我需要遍历该对象,并且在循环内,我需要调用 Firebase 以获取相应的 userName然后返回一个包含 convos、userNames 和 userIDs 的对象。
我尝试过使用 async/await,我从 console.log 得到的结果是正确的,但之后我的 return 语句是未定义的。为什么会这样?他们正在接收相同的对象。
store.js getter sn-p
getConvosObj: state => {
var convoObj = {};
var userConvos = state.userProfile.convos;
async function asyncFunction() {
for (const key in userConvos) {
if (userConvos.hasOwnProperty(key)) {
const userID = userConvos[key];
var userName;
await fire.database().ref('/users/' + userID + '/userName').once('value', async (snapshot) => {
userName = await snapshot.val();
convoObj[key] = {userName, userID}
})
}
}
console.log(convoObj); //result: correct object
return convoObj; //result: undefined
}
asyncFunction();
}
【问题讨论】:
-
你怎么知道你的函数返回
undefined? -
我假设你认为
getConvosObj会返回convoObj?因为它不返回任何东西。 -
按照设计,getter 并不意味着是异步的。相反,它们应该返回某个存储状态,并在状态更改时进行响应式更新。事实上,上面的代码示例很难预测,这只是证明了这个概念。这种方法也存在性能缺陷。请尝试坚持最初的想法:调用动作 -> 用突变改变状态 -> 用吸气剂返回状态。这种方式流程清晰且可调试。
-
是的,我试图使用
getConvosObj来返回convoObj。我对 Vue 还很陌生,所以我不记得我不应该在 getter 中做异步的东西。我已经按照下面 sosmii 建议的方式对其进行了重组,现在可以使用了。谢谢大家!
标签: javascript firebase vue.js async-await vuex