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