森林海
2023-06-09 17:30:13
Firebase 原子增量可用于更新或設(shè)置。但是他們不會在完成時(shí)返回更新的值。所以,我必須在更新或設(shè)置后立即使用 once('value') : var submitref = firebase.database().ref('/sequence/mykey') return submitref.set(firebase.database.ServerValue.increment(1)).then(_=>{ return submitref.once('value').then(snap=>snap.val()); });讓我們假設(shè) 2 個(gè)線程正在同時(shí)執(zhí)行此代碼。submitref.set() 可以正常工作,因?yàn)樵釉隽?。但是,如果它們同時(shí)完成 submitref.set() 并同時(shí)執(zhí)行 submitref.once('value'),則兩個(gè)線程將收到相同的遞增值 +2。這是一種可能性還是我沒有正確理解它?
2 回答

隔江千里
TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
該increment
操作在服務(wù)器上以原子方式執(zhí)行。在他們的操作中不能保證所有客戶端(甚至任何客戶端)都會看到所有中間狀態(tài)。
保持順序、單調(diào)遞增計(jì)數(shù)器的用例更適合事務(wù),因?yàn)樵谑聞?wù)中,客戶端根據(jù)當(dāng)前值控制新值。

慕娘9325324
TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
JavaScript 是一種單線程語言。相對于任何其他代碼,每一位代碼都以某種順序執(zhí)行。除了通過任何本機(jī)庫外,沒有線程爭用,這里不是這種情況。此外,實(shí)時(shí)數(shù)據(jù)庫將所有操作按照接收順序通過單個(gè)連接進(jìn)行流水線處理,因此其操作也具有一致的順序。
綜上所述,我想您可能會遇到這樣一種情況,即兩次調(diào)用發(fā)生set()
在兩次調(diào)用之前once()
,這意味著它們都將顯示兩倍的增量值。
在這種情況下,您最好使用 listener withon()
以便隨時(shí)了解最新的值,并在看到它發(fā)生變化時(shí)對其采取行動,而不管建立它之后會發(fā)生什么。
添加回答
舉報(bào)
0/150
提交
取消