首页 > 解决方案 > node.js async 承诺顺序执行

问题描述

我正在尝试使用 node.js 编写 Firebase 函数

在下面的代码中,当消息数据库中有新条目时,会触发“pushNotifications”函数。

从messagesDB 我从messages 字典中获取电子邮件。

  1. 使用电子邮件地址调用函数 getUserID() 以获取 UID
  2. 收集的 UID 然后将其传递给 getUserStatus(uid) 并获取返回布尔值的当前状态。

如果没有用户的 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.......');
});

标签: node.jsfirebasegoogle-cloud-functions

解决方案


您缺少返回语句,因此下面的承诺没有收到任何输出。

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
})

并且承诺在您使用它们时不起作用。通过将变量设置为 Promise,您不能简单地在其执行完成之前对其输出进行控制台记录。所以不要console.log('statusOnline : ', statusOnline);做这样的事情

statusOnline.then(result => {console.log('statusOnline : ', result)});

推荐阅读