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

Важно управлять жизненным циклом функции, чтобы гарантировать ее правильное разрешение. Правильно завершая функции, вы можете избежать чрезмерных затрат на функции, которые выполняются слишком долго или бесконечны в цикле. Кроме того, вы можете быть уверены, что экземпляр 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 содержат примеры правильного завершения функции. Вот несколько типичных случаев: