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

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

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

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

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

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

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

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

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