node.js async обещает последовательное выполнение - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь написать функции Firebase, используя node.js

В приведенном ниже коде функция «pushNotifications» запускается, когда есть новая запись в messagesDB.

Из сообщений DB я получаю электронное письмо из словаря сообщений.

  1. Вызов функции getUserID () с адресом электронной почты для получения UID
  2. Собранный UID являетсязатем передайте его getUserStatus (uid) и получите текущий статус, который возвращает значение bool.

Я не смогу получить статус пользователя без его uid, и его необходимо было выполнять последовательно.

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

function getUserStatus(uid) {

  var onlineStatus = true;
  console.log('getting the status.........', uid);
  return firestoreDB.collection('userstatus').doc(uid).get()
    .then(doc => {
      if (doc.exists) {
        onlineStatus = doc.data()['online'];
      }
      return onlineStatus;
    })
    .catch(err => {
      return err;
    });
}

function getUserID(toId) {
  var uid;
  console.log('get uid function....');
  return admin.auth().getUserByEmail(toId)
    .then((userRecord) => {
      console.log('record :', userRecord);
      uid = userRecord.uid
      console.log('uid :', uid);
      console.log(`getting document`);
      return uid;
    })
    .catch((error) => {
      console.log("Error fetching getUserID :", error);
      return err;
    })
}


exports.pushNotifications = functions.database.ref('/Messages/{messageID}').onWrite(event => {

  console.log('event Data : ', event.after._data);
  const data = event.after._data;
  const fromId = data.from;
  const toId = data.to;
  const message = data.messageText;
  console.log(fromId + ' sent a message to ' + toId);
  console.log('getting uid..');

  const statusOnline = getUserID(toId)
  .then(uid => {
                console.log('got uid', uid); 
                getUserStatus(uid)
              })
  .then(status => {return status})
  .catch(err => console.log('Error executing the promises', err.message));
  console.log('statusOnline : ', statusOnline);
  console.log('Done.......');
});

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я думаю, что вы хотите «решить», где вы «возвращаетесь», и «отклонять», где вы ловите / бросаете.

0 голосов
/ 28 мая 2018

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

const statusOnline = getUserID(toId)
  .then(uid => {
    console.log('got uid', uid); 
    return getUserStatus(uid); // return your result
  })
  .then((status) => .... )

, а также вы на самом деле ничего не делаете со своим статусом.попробуйте console.log(status) после того, как вы получили статус.

.then(status => {
  console.log("the status obtained was ", status);
  return status
})

, и обещания не работают, когда вы их используете.Установив переменную в качестве Обещания, вы не можете просто консоль записать в журнал ее вывод, прежде чем он будет выполнен, выполняя себя.поэтому вместо console.log('statusOnline : ', statusOnline); сделайте что-то подобное

statusOnline.then(result => {console.log('statusOnline : ', result)});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...