为什么在Firebase交易期间我的函数参数求值为不同的值?

时间:2018-06-29 18:13:08

标签: firebase firebase-realtime-database google-cloud-functions

在我的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。怎么会这样?

1 个答案:

答案 0 :(得分:0)

您对函数执行顺序的观察是正确的-Cloud Functions不保证有关该顺序的执行。这是因为云功能需要可扩展,并在多个服务器实例上运行您的功能。当您开始以这种方式并行运行功能时,就无法保证顺序(所有相关系统之间的不确定性延迟太多)。您的代码需要处理这个事实。

您对cur_num_picks的值的第二次观察是完全不相关的。对于事务,您需要期望对函数接收的第一个值可以为空。您的代码应处理这种情况。 Read more about that here