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

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