关于这个主题,这里有很多类似的问题,但似乎都有非常具体的答案,似乎不适用于我的情况。
我有一个Google Firebase RTB数据快照被传递给这个函数。我想把快照变成一个自定义对象数组。每个对象代表一个子节点和所有子节点。我还想在返回数组之前对子数据做一些处理。后处理是个问题,因为你不能在foreach中的函数上调用await。
经过深入研究,我在StackOverflow上发现了这种方法,创建了一个子函数来解析数据,并将所有承诺存储在它们自己的数组中,然后从顶层调用(等待)getData()函数:
export async function unpack_snap(snap: any): Promise<(CustomObject[] | null)>{
const toWait: any[] = [];
console.log(JSON.stringify(snap));
await snap.forEach(async obj => {
toWait.push(obj_from_snap((obj))); // add this promise to the array
console.log(obj.key); // I added this to see if it was looping
});
await Promise.all(toWait);
return toWait;
}
export async function obj_from_snap(co: DataSnapshot) : Promise<(CustomObject | null)>{
var newCO: CustomObject = {
val1 : co.val().val1,
val2 : co.val().val2,
Data : await GetData(co.key)
};
console.log(`Data: ${newCO.Data}`)
return newCO;
}
export async function getData(key: String) Promise<(String | null)>{
...
}
不幸的是,这将返回一个包含空对象的数组(日志显示:[{}]). forEach中的日志记录输出只触发一次,即使快照的字符串化JSON显示了多个有效子项。与helper函数中newCO.Data的日志记录相同。
为什么此进程不循环?
另外,如果我返回toWait[]数组,它会包含所有作为helper函数输出的CustomObject对象吗?如果不是,有没有更好的方法来生成CustomObject数组,每个对象来自不同的函数调用?修改后的JSON作为输出也可以。
有什么建议吗?谢谢你的时间。
更新
我试图只循环ForEach并打印密钥。
await snap.forEach(async obj => {
console.log(obj.key); // I added this to see if it was looping
});
return null;
和前面一样,打印第一个子键,函数退出,返回null,不管有多少个子节点。我不明白为什么代码不迭代循环,这让我相信这不是Promise.all()的问题。有什么想法吗?
1条答案
按热度按时间kmpatx3s1#
我能回答我的两个问题!在这里发帖,以防有一天有人发现这个...
这是按预期工作的。