Как убедиться, что выполнение функций в порядке?

У меня есть функция, запускаемая 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 вызова очень близки друг к другу, есть ли вероятность, что функция может вернуть одно и то же число? Если да, то есть ли способ предотвратить это?


person Sarun Intaralawan    schedule 29.07.2017    source источник
comment
Поскольку JavaScript является однопоточным, можно указать одно и то же число.   -  person Daniel Tran    schedule 29.07.2017


Ответы (1)


Да, вы правы, такая проблема может быть. Я не знаком с firebase, но ищу что-то, что позволяет вам напрямую увеличивать это число в firebase без необходимости его предварительного извлечения. Это будет атомарная операция, и убедитесь, что вы не столкнетесь с проблемой, которую вы описали.

Если это невозможно с firebase, вам, возможно, придется настроить сервер посередине, который каким-то образом ведет запись счетчика. Каждый раз, когда вы хотите увеличить/уменьшить число, запрос проходит через ваш сервер, который сначала выполняет операцию с кешем, а затем завершает запрос, вызывая API Firebase.

Обновление: вот как Firebase рекомендует это:

ref.transaction(function (current_value) {
  return (current_value || 0) + 1;
});
person Lucky Soni    schedule 29.07.2017