【问题标题】:How to perform two firebase database operation on different nodes in single request/function?如何在单个请求/函数中在不同节点上执行两个 firebase 数据库操作?
【发布时间】:2021-05-23 11:20:53
【问题描述】:

我是 react-native developer,是 firebase 的新手。我正在执行 firebase 实时数据库操作,请看下面的代码;

firebase.database().ref('events/wedding/items').push(object).then((data) => {
    //success callback
    dispatch(addPendingInvoice({ ...invoice, id: data.key }))
    Alert.alert('Successfully added to Invoices', 'Please go to invoice section to clear first and continue.', [{ text: 'Ok' }])
}).catch((error) => {
    //error callback
    Alert.alert("Can't book package.", 'Please check your internet connection!', [{ text: 'OK', style: 'destructive' }])
})

现在,我希望将另一个对象推送到另一个节点 events/wedding/packages 就在上面的这个 firebase 数据库函数之后。我可以在里面使用另一个函数,然后在上面的 firebase 函数中回调。这不是专业的方法。

有什么办法吗?

【问题讨论】:

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


    【解决方案1】:

    您可以使用update() 方法“同时写入一个节点的特定子节点而不覆盖其他子节点”。请注意,“以这种方式进行的同时更新是原子的:要么所有更新都成功,要么所有更新都失败”,请参阅doc

    因此,在您的情况下,您将按照以下方式进行操作:

    var newNodeKey = firebase.database().ref().child('events/wedding/items').push().key;
    
    var updates = {};
    updates['events/wedding/items/' + newNodeKey] = { foo: "bar" };
    updates['events/wedding/packages/' + newNodeKey] = { bar: "foo" };
    
    firebase.database().ref().update(updates)
        .then(() => {
            // The two writes are completed, do whatever you need
            // e.g. dispatch(...);
    
        });
    

    【讨论】:

    • 非常感谢兄弟!该引用是错误的,仅此而已。
    • 不客气。我会调整答案并删除reference
    • 通过这个 update() 函数,我们可以更新某个路由上的一个对象,同时将某个对象推送到另一个路由吗?
    • 我猜你所说的路线是指路径或参考。答案是肯定的,你可以写两个完全不同的参考,比如updates['events/wedding/items' + newPostKey] = { foo: "bar" }; updates['abcd/efgh' + newPostKey] = { bar: "foo" };
    【解决方案2】:

    所有 Firebase 操作都会返回一个承诺,因此您可以使用 Promise.all() 同时运行它们。

    Promise.all([
       firebase.database().ref(reference).set({}),
       firebase.database().ref(reference2).set({})
    ]).then(() => {
      console.log("Operations Successful")
    }).catch((e) => console.log(e))
    

    您还可以将所有操作推送到一个数组,然后将该数组传递给 Promise.all()

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多