node.js async承诺顺序执行

时间:2018-05-28 13:58:33

标签: node.js firebase google-cloud-functions

我正在尝试使用node.js

编写Firebase函数

在下面的代码" pushNotifications"在messagesDB中有新条目时触发函数。

我从messagesDB收到邮件字典中的电子邮件。

  1. 使用电子邮件地址调用函数getUserID()以获取UID
  2. 收集的UID然后将其传递给getUserStatus(uid)并获取返回bool的当前状态。
  3. 如果没有他的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 :(得分:2)

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

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

答案 1 :(得分:0)

我认为你想要'解决'你'回归'和'拒绝'你捕获/投掷的地方。