如何确保函数的执行顺序?

时间:2017-07-29 11:30:00

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

我有一个HTTP触发的函数,每次调用端点时都会返回一个增量编号。代码如下所示:

export const reserve = functions.https.onRequest((req, resp) => {
  cors(req, resp, async () => {
    if (req.method.toLowerCase() !== 'post') {
      resp.status(405);
      resp.end();
    } else {
      const path = `counter`;
      const ref = firebase.database().ref(path);
      const oldCount = (await ref.once('value')).val();
      await ref.set(oldCount + 1);
      resp.status(200).send({
        number: oldCount
      });
      resp.end();
    }
  });
});

问题是,如果2个调用彼此非常接近,那么该函数是否有可能返回相同的数字?如果是这样,有没有办法防止这种情况?

1 个答案:

答案 0 :(得分:2)

是的,你是对的,可能会出现这样的问题。我不熟悉firebase,但是寻找一些东西可以让你直接在firebase中增加这个数字而不必先获取它。这将是一个原子操作,并确保您不会遇到您描述的问题。

如果使用firebase无法做到这一点,那么您可能必须在中间设置一个服务器,以某种方式保留计数器的记录。每次要增加/减少数量时,请求都会通过您的服务器,该服务器首先对缓存执行操作,然后通过调用Firebase API完成请求。

<强>更新 以下是Firebase recommends this

的方法
ref.transaction(function (current_value) {
  return (current_value || 0) + 1;
});