listAll firebase存储执行顺序

a8jjtwal  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(96)

我想在收集所有文件路径后返回,但函数返回空列表。

async function gcsFilesListTwo(uid: string): Promise<string[]> {
    let ret: string[] = []
    if (browser) {
        const storage = firestorage();
        const listRef = ref(storage, `gs://bucket/folder`);

        listAll(listRef)
            .then((res) => {
                res.prefixes.forEach((folderRef) => {
                    listAll(folderRef).then(subRes => {
                        subRes.items.forEach((itemRef) => {
                            if (itemRef.fullPath.endsWith(".pdf")) {
                                ret.push(itemRef.fullPath)
                            }
                        });
                        return ret;
                        // I want to return here after adding all files
                        //But this happens after the function return
                    })
                });
            })
            .catch((error) => {
                console.log("list error", error)
            });
        return ret
    }
    return ret
}

字符串

h43kikqp

h43kikqp1#

你现在所做的,就是把asyncthen/catch回调混合在一起。两者只能选其一,不能两者都选。但是,正如@DougStevenson在他的评论中也提到的,如果你想把你的函数声明为async函数,那么您必须使用await等待所有的承诺都被解析,这样您才能得到请求的结果。回呼。
我在你的代码中看到,你使用的是一个forEach,但是在异步调用的情况下,它并不能像你所期望的那样工作。所以为了解决这个问题,你应该创建一个空数组,在其中你应该所有的承诺,并在最后简单地调用:

await Promise.all(promises);

字符串
更多信息如下:

83qze16e

83qze16e2#

虽然答案在评论中,但我在这里为像我这样的非TS程序员发布了修改后的代码。

async function gcsFilesListTwo(uid: string): Promise<string[]> {
    let ret: string[] = []
    if (browser) {
                const storage = firestorage();
        const listRef = ref(storage, `gs://bucket/folder`);

        const res = await listAll(listRef)
        for (const folderRef of res.prefixes) {
            let subRes = await listAll(folderRef)
            for (const itemRef of subRes.items) {
                if (itemRef.fullPath.endsWith(".pdf")) {
                    ret.push(itemRef.fullPath)
                }
            }
        }
        return ret
    }
    return ret
}

字符串

相关问题