Что происходит с вызовами asyn c в завершенных функциях firebase? - PullRequest
0 голосов
/ 25 января 2020

Если я решу не ждать завершения асинхронного вызова c внутри функции firebase, что произойдет с вызовом asyn c после завершения функции? В каком потоке он продолжается, все еще работает в пределах времени выполнения функции и как это влияет на использование?

import * as firebase from 'firebase';
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

exports.action = functions.https.onRequest((req, res) => {
    admin.database().ref('action').add({ 1: 2 });
    res.end(); // or just `return;` for other functions
});

Или, может быть, даже

exports.action2 = functions.https.onRequest((req, res) => {
    new Promise(resolve => setTimeout(() => admin.database().ref('action').add({ 1: 2 })}, 10_000));
    res.end();
});

1 Ответ

2 голосов
/ 25 января 2020

Ознакомьтесь с этим разделом документации по облачным функциям, в которой объясняется, почему "важно управлять жизненным циклом функции, чтобы обеспечить ее правильное разрешение".

Если вы хотите быть уверены, что «экземпляр Cloud Functions, выполняющий вашу облачную функцию (CF), не завершит работу до того, как ваш CF успешно достигнет своего завершающего состояния или состояния» (в вашем случае, когда асинхронная работа выполнена), вам необходимо "разрешите свой CF, вернув JavaScript обещание".

Так что, если вы этого не сделаете, есть риск, что экземпляр Cloud Functions, выполняющий ваш CF, отключится до того, как вы позвоните одному или нескольким asyn c функции завершены.

Однако, это действительно НЕ означает, что это всегда будет происходить . Вполне возможно, что экземпляр Cloud Functions, выполняющий ваш CF, продолжит работу после того, как вы отправите ответ клиенту (с res.end();), что приведет к завершению асинхронной c работы.

проблема в том, что это полностью вне вашего контроля (это зависит от того, как платформа Cloud Functions управляет вами экземплярами Cloud Function): иногда она может продолжать работать (завершая работу asyn c), иногда это может не.

Вы найдете много вопросов по облачным функциям при переполнении стека, которые объясняют, что их проблема в том, что облачная функция иногда выполняет асинхронную работу c, а иногда нет: причина в том, что они не t вернуть обещания, возвращаемые асинхронными вызовами c.

Влияет ли это на использование?

Да, как ясно сказано в do c: «Правильно завершая функции, вы можете избежать чрезмерных расходов от функций, которые работают слишком долго или бесконечно.


Итак, конкретно, в вашем случае вы должны сделать что-то вроде:

exports.action = functions.https.onRequest(async (req, res) => {  //  <-- Note the async keyword here
    await admin.database().ref('action').add({ 1: 2 });
    res.end(); // or just `return;` for other functions
});

Обратите внимание, что если ваша облачная функция синхронная (это не вызывает какой-либо асинхронный метод) его нужно завершить простым оператором return; (или вызовом send(), redirect() или end() для облачной функции HTTPS). Например:

exports.action = functions.https.onRequest((req, res) => {
    const result = 1 + 3;
    res.status(200).send(result);
});

или

exports.unusefulCloudFunction = functions.firestore
    .document('users/{userId}').onWrite((change, context) => {
      const result = 1 + 3;
      console.log(result);
      return;
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...