gpt4 book ai didi

firebase - 交易数据为空

转载 作者:行者123 更新时间:2023-12-04 13:08:12 24 4
gpt4 key购买 nike

我有交易问题。事务中的数据始终为空,并且更新处理程序仅被调用一次。 documentation说:

To accomplish this, you pass transaction() an update function which is used to transform the current value into a new value. If another client writes to the location before your new value is successfully written, your update function will be called again with the new current value, and the write will be retried. This will happen repeatedly until your write succeeds without conflict or you abort the transaction by not returning a value from your update function



现在我知道现在没有其他客户端访问该位置。其次,如果我正确阅读了文档,如果无法检索和更新数据,则应多次调用 updateCounters 函数。

另一件事 - 如果我去掉条件 if (counters === null)执行将失败,因为计数器是 null但是在随后的尝试中,事务完成得很好 - 检索数据并进行更新。

简单 once - set在这个位置工作得很好,但不安全。

请问我想念什么?

这是代码
self.myRef.child('counters')
.transaction(function updateCounters(counters){
if (counters === null) {
return;
}
else {
console.log('in transaction counters:', counters);
counters.comments = counters.comments + 1;
return counters;
}
}, function(error, committed, ss){
if (error) {
console.log('transaction aborted');
// TODO error handling
} else if (!committed){
console.log('counters are null - why?');
} else {
console.log('counter increased',ss.val());
}
}, true);

这是该位置的数据
counters:{
comments: 1,
alerts: 3,
...
}

最佳答案

通过返回 undefined在您的 if( ... === null )阻止,您正在中止交易。因此,它永远不会向服务器发送尝试,永远不会意识到本地缓存的值与远程缓存的值不同,并且永远不会重试更新的值(来自服务器的实际值)。
committed 证实了这一点。是 false错误是 null在您的成功函数中,如果事务中止就会发生这种情况。

交易工作如下:

  • 将本地缓存的值传递给处理函数,如果你从来没有从服务器上取过这个数据,那么本地缓存的值为null (该路径最可能的远程值)
  • 从处理函数中获取返回值,如果该值是 undefined中止事务,否则,创建当前值(空)的散列并将该值和新值(由处理函数返回)传递给服务器
  • 如果本地散列与服务器的当前散列匹配,则应用更改并且服务器返回成功结果
  • 如果服务器事务没有被应用,服务器返回新值,客户端然后用服务器更新的值再次调用处理函数,直到成功
  • 当最终成功并且发生不可恢复的错误时,或者事务被中止(通过从处理函数返回 undefined )时,将使用结果调用成功方法。

  • 因此,要完成这项工作,显然您不能在第一个返回值上中止事务。

    实现相同结果的一种解决方法是将事务包装在 once('value', ...) 中,尽管它是耦合的并且不如仅按设计使用事务那样高效或合适。回调,这将确保它在运行事务之前在本地缓存。

    关于firebase - 交易数据为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28811037/

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