Важно управлять жизненным циклом функции, чтобы она правильно выполнялась. Правильное завершение функций позволяет избежать чрезмерных расходов, связанных с их длительным выполнением или бесконечным циклом. Кроме того, вы можете убедиться, что экземпляр Cloud Functions, на котором выполняется функция, не завершает работу до тех пор, пока функция не достигнет конечного состояния.
Чтобы управлять жизненным циклом функций, следуйте приведенным ниже рекомендациям.
- Функции, выполняющие асинхронную обработку (также известные как фоновые функции), должны возвращать объект Promise JavaScript.
- Завершайте функции HTTP с помощью
res.redirect(),res.send()илиres.end(). - Завершите синхронную функцию с помощью оператора
return;.
Как упростить асинхронный код с помощью объектов Promise в JavaScript
Промисы – это современная альтернатива обратным вызовам для асинхронного кода. Объект 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 примеров кода есть примеры правильного завершения функций. Вот несколько примеров:
- Триггер Realtime Database: HTTP-функция с последующим перенаправлением.
- Триггер Cloud Storage:
скачивание из хранилища, за которым следует
then - Вебхук в базе данных реального времени при записи:
ошибка, возникшая в предложении
then - Периодически удаляйте неиспользуемые аккаунты: невыполненное обещание