typescript ForEach未循环键入脚本,Firebase函数

gcuhipw9  于 2022-11-18  发布在  TypeScript
关注(0)|答案(1)|浏览(140)

关于这个主题,这里有很多类似的问题,但似乎都有非常具体的答案,似乎不适用于我的情况。
我有一个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()的问题。有什么想法吗?

kmpatx3s

kmpatx3s1#

我能回答我的两个问题!在这里发帖,以防有一天有人发现这个...

export async function unpack_snap(snap: any): Promise<(any[] | null)>{
    var array: any[] = [];          // Array of objects
    const toWait: any[] = [];       // Array of promises
    console.log(JSON.stringify(snap));   // Log the input for debugging

    await snap.forEach(function(obj) {     // CHANGED FROM async (obj) to function (obj)
        toWait.push(obj_from_snap((obj)).then((result) => array.push(result)));    // Added a chained promise to the first, which adds the result to my output array
    });
    await Promise.all(toWait);   // wait until all promises are complete
    return array;                // return the array
}

这是按预期工作的。

相关问题