Синхронизация, асинхронность и обещания

Важно управлять жизненным циклом функции, чтобы обеспечить её корректное завершение. Правильно завершая функции, вы можете избежать чрезмерных затрат, связанных с функциями, которые работают слишком долго или зацикливаются. Кроме того, вы можете убедиться, что экземпляр Cloud Functions , на котором выполняется ваша функция, не завершит работу до того, как функция успешно достигнет состояния завершения.

Используйте следующие рекомендуемые подходы для управления жизненным циклом ваших функций:

  • Функции, выполняющие асинхронную обработку (также известные как «фоновые функции»), разрешаются путем возврата промиса JavaScript .
  • Завершайте HTTP-функции с помощью res.redirect() , res.send() или res.end() .
  • Завершение синхронной функции оператором return;

Упростите асинхронный код с помощью промисов JavaScript.

Промисы — это современная альтернатива колбэкам для асинхронного кода. Промис представляет собой операцию и будущее значение, которое она может вернуть. Он также позволяет распространять ошибки аналогично конструкциям try/catch в синхронном коде. Подробнее о промисах в Firebase SDK можно прочитать в блоге Firebase , а о промисах в целом — на MDN .

Как работают промисы с функциями

Когда вы возвращаете JavaScript-промис функции, эта функция продолжает выполняться до тех пор, пока промис не будет разрешен или отклонен. Чтобы указать на успешное завершение работы функции, промис должен быть разрешен. Чтобы указать на ошибку, промис должен быть отклонен. Это означает, что вам нужно обрабатывать только те ошибки, которые вы хотите.

Следующий код принимает ref Firebase Realtime Database и устанавливает её значение равным "world!" . Возвращая результат операции set , ваша функция гарантированно будет продолжать работать до тех пор, пока асинхронная работа по записи строки в базу данных не будет полностью завершена:

// Always change the value of "/hello" to "world!"
exports.hello = functions.database.ref('/hello').onWrite(event => {
  // set() returns a promise. We keep the function alive by returning it.
  return event.data.ref.set('world!').then(() => {
    console.log('Write succeeded!');
  });
});

Примеры в контексте

Большинство наших примеров кода Cloud Functions содержат примеры корректного завершения функций. Вот несколько примеров, демонстрирующих типичные случаи: