gpt4 book ai didi

javascript - 链接多个 firebase 操作和回滚

转载 作者:行者123 更新时间:2023-11-30 12:02:37 24 4
gpt4 key购买 nike

我正在使用 firebase,我想链接一些操作。这是场景:我想向数组中添加一个项目,因为我不想使用推送 ID,所以每次添加一个项目时,我都会在 firebase 中更新一个“Last_Id”变量。我还更新了一个“计数器”变量来计算记录的数量(所以我最终不会使用 numChildren() ,它可能很慢)。count 和 last_id 变量在同一棵树中,如下所示:计数:
---------->last_id
---------->计数器
我这样做是为了在单个事务中同时更新它们

因此,当我添加一个项目时,我希望按顺序发生 3 件事:

  1. 1- 检索到 last_id

  2. 项目已添加

  3. last_id 和 Counter 是都更新了

这是我的代码,它使用了 promises。

add:function(ref,obj){

//get last_id
return baseRef.child('Count').child("Last_Id").once("value")
.then(function(snapshot){
return (snapshot.val()+1);
})
//add new data
.then(function(key){
return baseRef.child(ref).child(key).set(obj,function(error){
if (error)
console.log(error.code)
})
})
//update Count and last key
.then(this.updateCountAndKey(ref,1))


},


updateCountAndKey:function(ref,i){
return baseRef.child('Count').transaction(function(currentValue) {
if (currentValue!==null)
return {
Counter:(currentValue.Counter||0) +i,
Last_Id:(currentValue.Last_Id||0)+1
}
},function(err,commited,snap) {
if( commited )
console.log("updated counter to "+ snap.val());
else {
console.log("oh no"+err);
}
},false)

}

因为我是 javascript 的新手,所以 promises 特别想知道这是否是一种可靠的做事方式。我还想知道如果出现问题如何回滚。因此,如果一件事失败,那么其他一切都会失败(例如,如果对 Last_id 和 Counter 的更新失败,则不会添加该项目)。非常感谢任何帮助。

最佳答案

作为 Firebase documentation指定,事务只能原子地修改此位置的数据,因此您不能使用事务来更新 Firebase 中的其他节点。

建议使用推送 ID(由 Firebase 以安全方式生成)。这将消除在流程的这一部分使用事务的需要。如果您需要维护计数,您仍需要使用事务。这应该在 #2(添加项目)成功时完成。

现在您的流程将如下所示:

  1. 推送一个项目(自动生成的 ID)
  2. 成功后,使用事务增加计数

关于javascript - 链接多个 firebase 操作和回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36266691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com