Моя функция не разрешается правильно?Также он не будет писать в базу данных на базе данных.Нет ошибок - PullRequest
0 голосов
/ 28 июня 2019

У меня есть облачная функция, которая работает без ошибок, однако она не будет записывать в базу данных после Promise.all

Я протестировал эту функцию в веб-браузере, и данные, кажется, разрешаютсяправильно после Promise.all.Когда я помещаю это в облачную функцию, console.log () после Promise.all показывает исходные данные, а не обновленные, как если бы он пропускал forEach и сразу же разрешал.Я не получаю такого поведения, когда функция запускается в браузере.

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

exports.scheduledIndexUpdate = functions.pubsub
  .schedule("every 30 minutes")
  .onRun(context => {
    console.log("This will be run every 30 minutes!");

    var newIndex;
    var getIndex = new Promise((resolve, reject) => {
      admin
        .firestore()
        .collection("billsIndex")
        .doc("GS2019Index")
        .get()
        .then(doc => {
          if (doc.exists) {
            newIndex = doc.data();
            resolve(newIndex);
          }
        });
    });
    return getIndex.then(index => {
      var keys = Object.keys(index);

      keys.forEach(function(key) {
        admin
          .firestore()
          .collection("billsMetaData")
          .doc(key)
          .get()
          .then(doc => {
            if (doc.exists) {
              const metaData = doc.data();
              let agree = 0,
                disagree = 0,
                neutral = 0,
                somewhatAgree = 0,
                somewhatDisagree = 0;

              if (metaData.votes) {
                if (metaData.votes.agree) {
                  agree = metaData.votes.agree;
                }
                if (metaData.votes.disagree) {
                  disagree = metaData.votes.disagree;
                }
                if (metaData.votes.neutral) {
                  neutral = metaData.votes.neutral;
                }
                if (metaData.votes.somewhatAgree) {
                  somewhatAgree = metaData.votes.somewhatAgree;
                }
                if (metaData.votes.somewhatDisagree) {
                  somewhatDisagree = metaData.votes.somewhatDisagree;
                }

                newIndex[key].userVotes =
                  agree + disagree + neutral + somewhatAgree + somewhatDisagree;
              }
            }
          });
      });
      Promise.all(keys).then(function(result) {

          admin
            .firestore()
            .collection("billsIndex")
            .doc("GS2019Index2")
            .set({
              newIndex
            });
          console.log(newIndex);
          console.log("done");

      });
    });
   });

Любая помощь будет оценена!

1 Ответ

1 голос
/ 28 июня 2019

Кажется, вы пытаетесь использовать getIndex, когда он все еще недоступен, взгляните на асинхронные операции ... используя async / await, вы можете реструктурировать свой код, чтобы он выглядел как

exports.scheduledIndexUpdate = functions.pubsub
  .schedule("every 30 minutes")
  .onRun(async context => {
    console.log("This will be run every 30 minutes!");

    var newIndex;
    var getIndex = await admin.collection("billsIndex")
                                .doc("GS2019Index")
                                .get()
                                .then(doc => doc.exists ? doc.data() : null);
    // you have you docs available here 
    for (let prop of getIndex) {
        await admin
          .firestore()
          .collection("billsMetaData")
          .doc(key)
          .get()
          .then(() => { /..,/ })
          // etc
    }

    await admin.firestore().collection("billsIndex")
      .doc("GS2019Index2")
            .set({
              newIndex
            });
    return Promise.resolve(/.../)

Таким образом, вы заставляете казнь ждать, пока обещание не будет выполнено

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