我有一个监视通知收集的功能,但是在快照中,我需要执行一个等待功能。
async function getNotifications() {
try {
firebase.firestore().collection("notifications").doc(firebase.auth().currentUser.uid).collection("messages")
.onSnapshot((qs) => {
const array = [];
const promises = [];
qs.forEach(async(n) => {
let data = n.data();
data.id = n.id;
if(data.type === "download") await storageGetDownloadURL(data.filepath);
array.push(data)
});
console.log(array)
return setNotifications(array);
});
} catch (e) {
message.error(e.message)
}
}
此行导致问题的原因是if(data.type === "download") promises.push(await storageGetDownloadURL(data.filepath));
。如果我保留它,则将填充数组,但是它有问题。在其上执行.length表示它为空,否则不为空。
如果我删除此行,则表示阵列已正确完成。
是否可以在快照中执行等待?我也尝试过将它们推到数组中,然后再调用它们,但是仍然存在相同的问题。
编辑:建议的重复问题不适用于Firebase快照。抛出qs is not iterable
for(const n of qs) {
let data = n.data();
data.id = n.id;
if(data.type === "download") await storageGetDownloadURL(data.filepath);
array.push(data)
}
我也按照@Doug Stevenson的建议进行了尝试,但是,如果我先注销array,然后注销array.length,我会得到一些奇怪的结果,即数组为空,但包含项,而length也表示为空
注意:我不必履行承诺就可以打破
const promises = [];
qs.forEach(async(n) => {
let data = n.data();
data.id = n.id;
if(data.type === "download") promises.push(await storageGetDownloadURL(data.filepath));
array.push(data)
});
console.log(array)
console.log(array.length)
由于此操作已关闭,因此我通过在循环内创建新的Promise并随后执行此操作,成功完成了此半工。虽然诺言中的等待不会引起问题,但不会执行
firebase.firestore().collection("notifications").doc(firebase.auth().currentUser.uid).collection("messages")
.onSnapshot(async(qs) => {
const array = [];
const promises = [];
qs.forEach((n) => {
promises.push(new Promise(async(res, rej) => {
let data = n.data();
data.id = n.id;
if(data.type === "download") await storageGetDownloadURL(data.filepath);
array.push(data);
return res();
}));
});
await Promise.all(promises);
return setNotifications(array);
});