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

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