Можно ли вернуть данные до конца функции onCall в Firebase Cloud Functions - PullRequest
0 голосов
/ 07 марта 2020

Я хотел бы знать, возможно ли вернуть данные до того, как моя функция onCall завершит работу sh. Вот что я пытаюсь сделать, и мои данные результатов в моем приложении всегда равны нулю:

exports.myFunction = functions.https.onCall((data, context) => {
  if (!context.auth || !context.auth.uid) {
    return {
      statut: "NOK",
    };
  }

  return Promise.all([promise1(), promise2()])
    .then(results => {
      const result1 = results[0].data();

      return FIRESTORE.collection('MyCollection')
        .add(result1)
        .then(results2 => {
          let queries = [];

          queries.push(
            function1234()
          );

          queries.push(
              FIRESTORE.collection('MyCollection2')
                .doc("123")
                .set({a: 123})
          );
          return Promise.all(queries)
            .then(r => {
              return { myReturn: "AAAA" };
            });

        })
        .then(r2 => {
          console.log('0000');
          return function9898();
        })
})

это моя функция на стороне клиента:

  myFunction = () => {
    var myFunctionCloud = firebase.functions().httpsCallable('myFunction');
    myFunctionCloud().then(function (result) {
      console.log(JSON.stringify(result));
    })
  }

Мои журналы:

{"data": null}

1 Ответ

0 голосов
/ 07 марта 2020

Я хотел бы знать, возможно ли вернуть данные до того, как моя функция onCall завершит работу sh.

Нет, это невозможно, поскольку возврат данных в функцию вызываемого облака указывает платформе Cloud Functions, что функция Callable Cloud завершена и что она может очистить все от этого вызова. Поэтому во многих случаях ваша облачная функция будет прервана до того, как ваша бизнес-логика c будет полностью выполнена.

В некоторых случаях, может быть , возможно, что Платформа Cloud Functions не прерывает ваш CF сразу, давая достаточно времени для полного выполнения бизнес-логики c, но это совсем не гарантируется. Полагаться на этот конкретный c случай не рекомендуется и фактически приводит к некоторому "errati c" поведению


Один из подходов - немедленно отослать результат обратно во внешний интерфейс и продолжить работа в фоновом режиме заключается в вызове Облачной функции PubSub (со всеми соответствующими входными данными в сообщении), а затем возвращении значения. Другими словами, вы делегируете оставшуюся работу другой облачной функции и останавливаете текущую вызываемую функцию, возвращая ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...