Сломанное обещание облачного пожарного магазина - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь получить документ для определенных идентификаторов в следующей облачной функции.Цикл (см. «Block Get Major») для получения этой информации выполняется, но журналы показывают, что он выполняет ПОСЛЕ того, как функция возвращает данные.Я уверен, что это потому, что это создает новое обещание, и что мне нужно связать их вместе.

Я просмотрел много постов здесь и в других местах и ​​просто не получаю его.

Похоже, я создаю нарушенное / отброшенное обещание.Я получаю необходимые данные, за исключением menteeMajor, который до сих пор не определен в файлах журнала).

exports.getAllMatchesMCR = functions.https.onCall((data, context) => {

  var dbRef = db.collection("matches");
  var dbPromise = dbRef.get();
  // return the main promise
  return dbPromise.then(function(querySnapshot) {
      var results = [];
      var idx = 0;
      querySnapshot.forEach(function(doc) {

        // push promise from get into results
        var matchObj = {
          mentorName: "",
          mentorEmployer: "",
          mentees: []
        }

        var mentor = doc.data();
        mentor.mentorID = doc.id;
        matchObj.mentorName = mentor.mentorID;
        matchObj.mentees = mentor.mentees;

        for (var curIDX in matchObj.mentees) {
          matchInfoObj = {};
          matchInfoObj.mentorID = matchObj.mentorID;
          matchInfoObj.mentorName = matchObj.mentorName;
          matchInfoObj.menteeName = matchObj.mentees[curIDX];

          // Block Get Major --->
          var menteeRef = db.collection('users').doc(matchObj.mentees[curIDX]);
        var getDoc = menteeRef.get()
          .then(doc => {
            if (!doc.exists) {
              console.log('No such document!');
            } else {
              var userInfo = {};
              userInfo = doc.data();

              matchInfoObj.menteeMajor = userInfo.major;

              // console.log('user Major:', matchInfoObj.menteeMajor);
              return userInfo.major;
            }
          })
          .catch(err => {
            // console.log('Error getting document', err);
            return ("No Mentee Doc")
          });
          
          console.log("in menteeInfo: ", getDoc.data());
          matchInfoObj.menteeMajor = getDoc.data();              // Block Get Major <---
          if (typeof something === "undefined") {
            console.log('After BLOCK Major is UNDEFINED:', matchInfoObj.menteeName);
          } else {
            console.log('After BLOCK :', matchInfoObj.menteeMajor);
          }

          results.push(matchInfoObj)
        }
      });
      // dbPromise.then() resolves to  a single promise that resolves 
      // once all results have resolved
      return Promise.all(results)
    })
    .catch(function(error) {
      console.log("Error getting documents: ", error);
    });
});

Вот два снимка экрана для журналов, которые показывают порядок, основанный на выводе console.log.Имейте в виду, что вид этих записей журнала является самым новым в верхней части. Результат 1 показывает запуск, после развертывания функции и ее запуска, Результат 2 показывает сообщения от нарушенного обещания почти через две минуты.

Версия того, что я пытаюсь выполнить, в виде простого текстаЧтобы сделать это: 1. коллекция "Пользователи" содержит информацию о подопечных и наставников 2. коллекция "Матчи" представляет собой документ подопечных (массив) для каждого наставника, или один ко многим).3. Отобразите одну строку для КАЖДОГО наставника / ученика.У меня есть идентификаторы, но мне нужно получить имена и другую информацию как для подопечных, так и для наставников.

Простой старый файл результатов показывает, что я получаю нужные мне строки с идентификатором Mentor и идентификатором Mentee (помечены как Mentees, которые будут меняться) Может кто-нибудь показать мне способцепочка это обещание?

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