使用 SveteKit 延迟承诺数据

Delayed promise data with SveteKit

提问人:ZAky 提问时间:11/15/2023 最后编辑:H.B.ZAky 更新时间:11/15/2023 访问量:16

问:

我需要从 firestore 存储 api 获取文件名列表

async function gcsFilesList(uid: string): Writable<T> {
   let ret: string[] = []
   let store = writable(ret);
   if (browser) {
    const storage = firestorage();
    
    const listRef = ref(storage, `gs://bucket_name/folder_name`);

    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)
                            console.log("store item", ret)
                        }
                    });
                })
            });
        })
        .catch((error) => {
            console.log("list error", error)
        });
   }
   return store
}

export const filesList = gcsFilesList

在+page.ts中,我调用了这个函数

/** @type {import('./$types').PageLoad} */
export async function load({ params }: { params: any }) {
    let ret = {
        data: getWork(params.id),
        files: filesList(params.id)
    };
    return ret
}

在 +page.svelte 中,我使用这些数据

onMount(async () => {
        filesData = data.files;
}
{#await filesData}
  <p>...waiting</p>
{:then files}
  <p>list of files {files}</p>
{:catch error}
  <p style="color: red">{error.message}</p>
{/await}
.
.
//OR
{#if $filesData != null}
  {#each $filesData as pfds}
  <p>{pfds}</p>
  {/each}
{/if}

无论如何,呈现的列表都是空的,几秒钟后,我看到函数返回的对象 (ret) 正在填充数据。但这些数据不会在 HTML 中呈现。

我需要做什么才能在数据出现时呈现数据。

Typescript sveltekit

评论

0赞 brunnerh 11/15/2023
你读过这方面的文档吗?

答: 暂无答案