我正在尝试从 firebase 读取数据。但是代码异步工作,它在获取数据之前显示数据。
我已经发布了我的代码
componentDidMount(){
var ref2 = database.ref();
this.getItems(ref2).then((items) => {
this.getResult(items).then((val) => {
// why is this val coming empty
ToastAndroid.show(JSON.stringify(val), ToastAndroid.SHORT);
});
});
}
getItems = async (ref2) => {
var items = [];
await ref2.once('value', snap => {
snap.forEach((child) => {
items.push(child.key);
});
});
// this is working fine . items is correctly returned
return items;
}
getResult = async (items) => {
var response = await this.getFinal(items);
// this response is empty why
return response;
}
getFinal = async (items) => {
var result = [];
await items.forEach((key) => {
ref = database.ref(key);
ref.once('value', snap => {
snap.forEach((child) => {
//val.push(child.val());
var id = child.key;
var data = {
username: child.val().username,
email: child.val().email,
name: child.val().name
};
result.push({[id]:data});
});
});
});
// this result is empty why
return result;
}
我期待 val 不为空,结果也不为空
正如 Lukas 评论的Array.forEach()
那样不返回承诺,所以调用await
它没有任何用处。
DatabaseReference.once()
但是,该调用确实返回了一个承诺,并且由于您有多个这样的调用,因此您可以收集这些承诺并等待所有这些承诺完成,然后再返回结果:
getFinal = async (items) => {
var promises = [],
result = [];
items.forEach((key) => {
ref = database.ref(key);
let promise = ref.once('value', snap => {
snap.forEach((child) => {
var id = child.key;
var data = {
username: child.val().username,
email: child.val().email,
name: child.val().name
};
result.push({[id]:data});
});
});
promises.push(promise)
});
await Promise.all(promises);
return result;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句