как правильно заставить транзакцию ждать, пока другое обещание выполнит Typescript - PullRequest
0 голосов
/ 19 мая 2019

У меня есть этот код, мне нужна вторая функция handleRequest для запуска первой. затем вторая функция после позже

код

const db = admin.firestore();
const docRef = db.collection("user").doc(`${UID}`);
let result;

    function update() {
      db.runTransaction(t => {
        return t.get(docRef).then(doc => {
          const newValue = doc.data().Funds + result;
          t.update(docRef, { Funds: newValue });
          return true;
        });
      })
        .then(success => {
          console.log("successfully updated");
        })
        .catch(error => {
          console.log(error);
        });
    }

    //the below function runs first and returns a value (data) that is 
    //needed by the function up top (update)

    handleRequest()
      .then(data => {
        console.log(data);
        result = parseFloat(data);
        update();  //the update function
        return true;
      })
      .catch(error => {
        console.log(error);
      });

Проблема в том, что когда я добавляю функцию Update в функцию handleRequest (которая является асинхронной), как в коде, handleRequest завершается ошибкой.

     4:36:22.241 PM onOrderCreate Function execution took 869 ms, finished 
    with status: 'ok'
4:36:21.991 PM onOrderCreate kPlpJCGkJ6XdsJlkxgobM5gHGUd2 
  //the console.log up top of UID. There is no log of the data from the 
  //handleRequest function 
4:36:21.377 PM onOrderCreate Function execution started

После удаления функции update другая функция handleRequest завершается успешно. Что мне не хватает, что добавление функции внутри функции .then приводит к сбою? Я также попробовал обходной путь, инициализируя переменную result с результатом функции handleRequest, такой как

function update() {
      db.runTransaction(t => {
        return t.get(docRef).then(doc => {
          const newValue = doc.data().Funds + result=handleRequest()
      .then(data => {
        console.log(data);
        result = parseFloat(data);
        update();  //the update function
        return true;
      })
      .catch(error => {
        console.log(error);
      });

          t.update(docRef, { Funds: newValue });
          return true;
        });
      })
        .then(success => {
          console.log("successfully updated");
        })
        .catch(error => {
          console.log(error);
        });
    }

Это просто помещает объект обещания в мою базу данных, Firestore. Функция handlerequest - это вызов Paypal для обработки orderID для получения значения заказа (это хорошо работает). Как только это будет сделано, он регистрирует возвращенные данные. Возвращенные данные - это данные, которые я пытаюсь сохранить в Firestore как транзакция
Как мне структурировать этот код, чтобы правильно сохранить в Firestore

1 Ответ

2 голосов
/ 19 мая 2019

Программы обычно выполняются последовательно сверху вниз кода, но не с асинхронной обработкой.

В последнее время он стал полезным миром, и асинхронная обработка может выполняться последовательно (в форме, которая выглядит), написав следующее.

при объявлении вашей update функции:
async function update() {

вызов update функция с await подписью:
await update()

Не забудьте добавить async подпись к вашей основной функции, например:
functions.https.onRequest(async (request, response) => {

Вы можете использовать functions.firestore.document(something).onCreate(async (snap, context)) вместо http.onRequest.
И я думаю, что handleRequest() также является асинхронным, вам нужно добавить async подпись тоже handleRequest(). И назовите это с await как ниже:

const data = await handleRequest();
const result = parseFloat(data);
await update(result);
return true;
...