在我的Firebase云功能代码中:
return num_picks_ref.transaction(function(cur_num_picks) {
console.log(`cur_num_picks: ${cur_num_picks}`)
console.log(`cur_num_picks <= 0: ${cur_num_picks <= 0}`)
if (cur_num_picks <= 0) {
console.error(`user ${uid} is submitting picks too fast, reached negative pick balance.`)
}
return cur_num_picks - 1
})
然后在输出日志中,我得到:
12:46:35.519 PM ---- db_positions_decrementPickCount ---- cur_num_picks: 87
12:46:35.420 PM ---- db_positions_decrementPickCount ---- user KtY8U5e1p8MCJDOFW2eEuLW5DO83 is submitting picks too fast, reached negative pick balance.
12:46:35.416 PM ---- db_positions_decrementPickCount ---- cur_num_picks: null
我知道可以transactions多次调用以保证原子写入,但这是环境中唯一修改cur_num_picks
的代码。在实时数据库中,没有其他地方可以修改该值。
似乎函数没有按照指定的顺序运行,这对我来说没有意义。
最重要的是,cur_num_picks
在第一行的计算结果为87,但在下一行的计算结果为87。怎么会这样?
答案 0 :(得分:0)
您对函数执行顺序的观察是正确的-Cloud Functions不保证有关该顺序的执行。这是因为云功能需要可扩展,并在多个服务器实例上运行您的功能。当您开始以这种方式并行运行功能时,就无法保证顺序(所有相关系统之间的不确定性延迟太多)。您的代码需要处理这个事实。
您对cur_num_picks
的值的第二次观察是完全不相关的。对于事务,您需要期望对函数接收的第一个值可以为空。您的代码应处理这种情况。 Read more about that here。