【问题标题】:Function getting firebase object returns hard to use object获取firebase对象的函数返回难以使用的对象
【发布时间】:2018-06-23 03:55:58
【问题描述】:

我要做什么

我正在使用 react native 和 firebase 创建一个社交媒体应用。我正在尝试调用一个函数,并让该函数从我的服务器返回一个帖子列表。

问题

在 firebase 查询上使用 return 方法让我很难使用对象数组:

Array [

   Object {
   "-L2mDBZ6gqY6ANJD6rg1": Object {
      //...
     },
   },

]

我不喜欢一个对象里面有一个对象,整个事情很难处理。我在我的应用程序中创建了一个列表并将其命名为项目,当将所有值推送到该列表时,我可以更轻松地使用对象:

Array [
Object {
 //...
   "key": "-L2mDBZ6gqY6ANJD6rg1",
  },
]

这个对象也更好用,因为关键不是对象的名称,而是它的内部。

我只返回我创建的数组,但返回未定义。

我的问题

在函数中,如何返回使用 firebase 查询创建的数组? (获取数组的对象)

我的代码

runQ(group){
var items = [];
//I am returning the entire firebase query...
return firebase.database().ref('posts/'+group).orderByKey().once ('value', (snap) => {
      snap.forEach ( (child) => {       
       items.push({
         //post contents
     });
     });
console.log(items)
//... but all I want to return is the items array. This returns undefined though.
})
}

【问题讨论】:

    标签: javascript arrays firebase react-native firebase-realtime-database


    【解决方案1】:

    如果我没有正确回答您的问题,请告诉我。所以,数据库中的posts 表现在看起来像这样:

    并且您想以这种方式返回这些帖子:

    [
        {
            "key": "-L1ELDwqJqm17iBI4UZu",
            "message": "post 1"
        },
        {
            "key": "-L1ELOuuf9hOdydnI3HU",
            "message": "post 2"
        },
        {
            "key": "-L1ELqFi7X9lm6ssOd5d",
            "message": "post 3"
        },
        {
            "key": "-L1EMH-Co64-RAQ1-AvU",
            "message": "post 4"
        }
        ...
    ]
    

    这是正确的吗?如果是这样,这就是你应该做的:

    var items = [];
    firebase.database().ref('posts').orderByKey().once('value', (snapshot) => {
        snapshot.forEach((child) => {
            // 'key' might not be a part of the post, if you do want to
            // include the key as well, then use this code instead
            //
            // const post = child.val();
            // const key = child.key;
            // items.push({ ...post, key });
            //
            // Otherwise, the following line is enough
            items.push(child.val());
        });
    
        // Then, do something with the 'items' array here
    })
        .catch(() => { });
    

    此处关闭主题:我看到您正在使用firebase.database().... 从数据库中获取帖子,您是使用云功能还是在您的应用程序中获取这些帖子,使用用户的设备这样做?如果是后者,您可能更愿意使用云功能和分页来获取帖子,主要是因为两个原因:

    1. 一次获取的帖子可能太多

    2. 这会导致安全问题,因为您允许每台设备连接到您的数据库(您必须提出真正好的安全规则来保证您的数据库安全)

    【讨论】:

    • 我在哪里退货?我需要将它返回到第一个函数。
    • firebase.database().ref(...).once('value') 是一个异步操作,这意味着函数 runQ 将在你真正得到结果之前终止,你会得到它们,但函数在此之前已经终止,因此,你无法返回结果。您可以做的是在您的应用程序中使用redux,如果您愿意这样做,我很乐意提供帮助。不过有一件事,由于您的应用程序从数据库中获取帖子,几乎可以保证您需要使用redux
    • 如果我有一个 .then(()=>{}) 代码就不会运行?
    • 不,不会,.then() 中的所有内容都将在获取帖子后执行,但runQ 在此之前已终止。这是你可以做的测试,在.then(),你console.log('posts have been fetched'),在runQ的末尾,你console.log('The function is about to terminate'),即使第二个日志语句出现在你的函数中的第一个日志语句之后,但是,结果是首先执行第二个日志语句。一句话:很遗憾,你不能只返回结果
    • 好的。我可以将结果推送到 .then() 中的状态吗?
    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2019-05-31
    相关资源
    最近更新 更多