Синхронные и асинхронные функции, а также объекты Promise

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

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

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

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

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

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

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

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