Облачные функции Google - повторите - PullRequest
0 голосов
/ 05 января 2020

У меня есть эта идемпотентная функция с несколькими обещаниями, которые я написал для Google Cloud Functions. Я хочу включить повторную попытку, так как мой используемый API довольно противоречив. Это требует возврата отклоненного обещания, когда требуется повторная попытка.

Поэтому я попытался вернуть обещание. Все ([]), но это не завершает / останавливает функцию при сбое одного из обещаний. Затем он даже переходит к обещанию. Все (). Тогда ()? Это должно произойти только тогда, когда все 4 обещания будут успешными.

Кто может указать мне правильное направление? Имеет ли смысл даже то, что я пытаюсь?

exports.scheduleTask = functions
  .firestore.document("tasks_schedule/{servicebonnummer}")
  .onCreate((snap, context) => {

    servicebonnummer = snap.data().data.servicebonnummer;
    bondatum = snap.data().data.bondatum;
    servicestatus = snap.data().data.servicestatus;
    tijdstip = snap.data().data.tijdstip;
    firestorePromise = null;
    firestoreFinish = null;
    cashPromise = null;
    cashFinish = null;

    //Firebase
    //firestoreSchedule executes the required promise
    //checkFinished points to a database where it checks a boolean for idempotency
    //firestoreFinish writes to this database and sets the boolean to true when the promise is successful

    if (!checkFinished("tasks_schedule", servicebonnummer, "firestore")) {
      firestorePromise = scheduleFirestore(
        servicebonnummer,
        bondatum,
        servicestatus,
        tijdstip
      )
        .then(output => {
          firestoreFinish = markFinished(
            "tasks_schedule",
            servicebonnummer,
            "firestore"
          );
          return output;
        })
        .catch(error => {
          console.error(
            "scheduleFirestore - Error connecting to Firestore: ",
            error
          );
          return error;
        });
    }

    //SOAP API
    //cashSchedule executes the required promise
    //checkFinished points to a database where it checks a boolean for idempotency
    //cashFinish writes to this database and sets the boolean to true when the promise is successful

    if (!checkFinished("tasks_schedule", servicebonnummer, "cash")) {
      cashPromise = scheduleCash(
        servicebonnummer,
        moment(bondatum),
        servicestatus,
        tijdstip
      )
        .then(result => {
          if (result[0].response.code === "2") {
            cashFinish = markFinished(
              "tasks_schedule",
              servicebonnummer,
              "cash"
            );
            return result;
          }
          throw new Error("Validation error, response not successful");
        })
        .catch(error => {
          console.error("scheduleCash - Error connecting to CASH API: ", error);
          return error;
        });
    }

    //CHECK PROMISES

    return Promise.all([
      firestorePromise,
      firestoreFinish,
      cashPromise,
      cashFinish
    ])
      .then(result => {
        removeTask("tasks_schedule", servicebonnummer);
        return result;
      })
      .catch(error => {
        console.error("scheduleTask - Retry: ", error);
        return error;
      });
  });

1 Ответ

3 голосов
/ 05 января 2020

Если вы введете код:

let somePromise = new Promise(...);
return somePromise.then(funcA).catch(funcB);

Тогда вы действительно вернете обещание. Однако, поскольку у вас есть обработчики для этого обещания в вашем коде, нам нужно взглянуть на то, что происходит более подробно. Предположим, что somePromise отклонено. Это будет означать, что будет вызван обработчик catch(). Это результат того, что обработчик перехвата станет окончательным разрешением возвращенного обещания.

Если мы посмотрим на документы MDN для Promise.catch(), мы обнаружим следующее:

Обещание, возвращаемое catch (), отклоняется, если onRejected выдает ошибку или возвращает Обещание, которое само отклоняется; в противном случае оно разрешается.

Если мы посмотрим на ваш код,

catch(error => {
  console.error("scheduleTask - Retry: ", error);
  return error;
});

А теперь спросим:

  1. Этот код вызывает ошибку ? Нет ... в нем нет оператора throw, и поэтому он просто возвращает переданные значения.
  2. Возвращает ли код Promise? Нет ... ему передается значение ошибки и просто возвращается значение ошибки, которое, я уверен, само по себе не будет обещанием.

Это означает, что общее возвращаемое обещание заключено в разрешено состояние, а не отклонено состояние и, следовательно, общая функция облака считается завершенной и не повторяется.

Возможны следующие варианты:

catch(error => {
  console.error("scheduleTask - Retry: ", error);
  throw error;
});

или

catch(error => {
  console.error("scheduleTask - Retry: ", error);
  return Promise.reject(error);
});

Ссылки:

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