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