limitToLast() 在 firebase 实时中不起作用

问题描述 投票:0回答:1

在构建查询以选择 Firebase 中的最新数据时,将选择所有数据,而不是参数中指定的数量。我注意到这个问题也存在于第一条消息选择中。其他查询参数我不知道,我没有使用过。

export const messagesRef = ref(database, `messages/`)
export async function getMessages() {
    return new Promise((resolve) => {
        const data = []
        const lastMessages = query(messagesRef, limitToFirst(10))
        const snapshot = get(lastMessages).then(() => {
            Object.entries(snapshot).forEach(([key, value]) => {
                data.push({ ...value, key: key })
            })
            resolve(data)
        })
    })
}

老实说,我什至不知道在这里做什么。我查看了 firebase 文档,但不明白我做错了什么。我询问了 copylot 并在 stackoverflow 中进行了挖掘。

javascript firebase firebase-realtime-database
1个回答
0
投票

您的代码在分配回调之前就访问

snapshot
inside。我的猜测是,您在那里看到过时的数据,例如:上次分配快照时的数据(我的猜测是:包含所有子数据)。

您的代码也包含一些反模式,所以这里我将如何实现

getMessages

export async function getMessages() {
    const data = []
    const lastMessages = query(messagesRef, limitToFirst(10))
    const snapshot = await get(lastMessages);
    snapshot.forEach((child) => {
        data.push({ ...child.val(), key: child.key })
    })

    return data;
}

您的变化:

  • 此代码不再依赖于回调之外的
    snapshot
    值。
  • 此代码不会返回自定义
    Promise
    ,而是使用 Firebase 已返回的承诺。
  • 此代码使用 Firebase 的内置
    forEach
    来循环结果,而不是
    Object.Entries
    (它对 Firebase 一无所知)。
© www.soinside.com 2019 - 2024. All rights reserved.