【问题标题】:Javascript Promises and FirebaseJavascript Promise 和 Firebase
【发布时间】:2018-05-25 07:11:44
【问题描述】:

我想用 firebase 函数执行一个函数 CheckAndCreate() 并仅在 CheckAndCreate() 时执行第二个函数 SendMessage()已为用户返回一个密钥...

var checkAndCreate = (sessionId, fbid, prenom, nom, genre) => {
    var userz = firebase.database().ref().child("accounts").orderByChild("fbid").equalTo(fbid).once("value").then(function(snapshot) {
        var exists = (snapshot.val() !== null);
        if (exists) {
            for (var key in snapshot.val()) break;
            console.log("ouiii jexiste" + key);
            sessions[sessionId].key = key;
            // I have the key we can continue
            snapshot.forEach(function(childSnapshot)  {
                console.log('snapshot.dernier_message'+childSnapshot.val().dernier_message);
                sessions[sessionId].dernier_message = childSnapshot.val().dernier_message;
            });

        }
        else {
            admin.auth().createCustomToken(fbid).then(function(customToken) {
                firebase.auth().signInWithCustomToken(customToken).then(function() {
                    var user2 = firebase.auth().currentUser;
                    var keyid = firebase.database().ref().child('accounts').push();
                    sessions[sessionId].key = keyid.key;
                    // I have the key we can continue
                    sessions[sessionId].dernier_message = new Date();
                    firebase.database().ref().child('accounts').child(keyid.key).set({
                        fbid: fbid,
                        prenom: prenom,
                        nom: nom,
                        nb_agression : 0,
                        dernier_message : new Date(),
                        genre: genre,
                        date: new Date().toISOString()
                    }).catch(function(error) {
                        console.log("erreur from firebas 9");
                    });
                }).catch(function(error) {
                    console.log("erreur from firebas 10");
                });
            }).catch(function(error) {
                console.log("erreur from firebas 11");
            });
        } // fin
    }).catch(function(error) {
        console.log("erreur from firebas 8 once");
    });
};

我的问题是对 Promises 的理解和 Javascript 的翻译。我可以执行我想要的吗?我该怎么做?
谢谢。

【问题讨论】:

  • 您显示的代码是否存在特定问题?
  • 一点也不!我唯一的问题实际上是,我在没有用户密钥的情况下执行第二个函数,因为 firebase 是异步的。我需要等待用户密钥

标签: javascript node.js firebase promise es6-promise


【解决方案1】:

您必须从 CheckAndCreate 函数返回一个承诺。了解 Promise 是如何工作的。在使用 nodejs 时,它们会为您提供很多帮助。

我在下面展示了您的代码应该如何构建以实现您想要的。我还利用 Promise 中的链接重构了您的一些代码。这使代码更具可读性。

var checkAndCreate = () => {
  return new Promise((resolve, reject) => {
    admin.auth().createCustomToken(fbid)
    .then((customToken) => firebase.auth().signInWithCustomToken(customToken))
    .then(() => {
          var user2 = firebase.auth().currentUser;
          var keyid = firebase.database().ref().child('accounts').push();
          sessions[sessionId].key = keyid.key;
          // I have the key we can continue
          sessions[sessionId].dernier_message = new Date();
          firebase.database().ref().child('accounts').child(keyid.key).set({
              fbid: fbid,
              prenom: prenom,
              nom: nom,
              nb_agression : 0,
              dernier_message : new Date(),
              genre: genre,
              date: new Date().toISOString()
          });
          resolve('some data you want to pass to SendMessage');
      })
      .catch((error) => {
          console.log("erreur from firebas 10");
          reject(error)
      });
  });
}

var SendMessage = () => {
  checkAndCreate()
  .then((result) => {
    // Send message based on result
  })
  .catch((err) => {
    // Do not send message
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-09
    • 2018-08-27
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多