Важно управлять жизненным циклом функции, чтобы обеспечить ее правильное разрешение. Правильно завершая функции, вы можете избежать чрезмерных расходов на функции, которые выполняются слишком долго или бесконечно зацикливаются. Кроме того, вы можете убедиться, что экземпляр Cloud Functions, в котором выполняется ваша функция, не выключается до того, как ваша функция успешно достигнет состояния или состояния завершения.
Используйте эти рекомендуемые подходы для управления жизненным циклом ваших функций:
- Разрешайте функции, выполняющие асинхронную обработку (также называемые «фоновыми функциями»), возвращая обещание JavaScript .
- Завершайте функции HTTP с помощью
res.redirect()
,res.send()
илиres.end()
. - Завершить синхронную функцию с
return;
заявление.
Упростите асинхронный код с помощью обещаний JavaScript
Обещания — это современная альтернатива обратным вызовам для асинхронного кода. Обещание представляет собой операцию и будущее значение, которое она может вернуть. Он также позволяет распространять ошибки, аналогичные try/catch, в синхронном коде. О обещаниях в Firebase SDK можно прочитать в блоге Firebase , а о обещаниях в целом — на MDN .
Как промисы работают с функциями
Когда вы возвращаете обещание JavaScript функции, эта функция продолжает работать до тех пор, пока обещание не будет разрешено или отклонено. Чтобы указать, что функция успешно завершила свою работу, обещание должно быть разрешено. Чтобы указать на ошибку, обещание должно быть отклонено. Это означает, что вам нужно обрабатывать только те ошибки, которые вы хотите.
Следующий код берет ref
базу данных Firebase 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 содержат примеры правильного завершения функции. Вот несколько примеров, демонстрирующих типичные случаи:
- Триггер базы данных в реальном времени : функция HTTP, за которой следует перенаправление
- Триггер облачного хранилища : загрузка хранилища, за которой
then
- Веб-перехватчик в базе данных реального времени пишет : ошибка возникает внутри предложения
then
- Периодически удалять неиспользуемые учетные записи : отклоненное обещание