2017-12-11 13 views
0

私はfirebase機能をCheckAndCreate()に関数を実行し、のSendMessage(第2の機能を実行したい)ときにのみCheckAndCreate()は、ユーザーのキーを返しました...Javascriptを約束し、Firebase

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

私の問題は、約束と翻訳の理解です。私が欲しいものを実行することはできますか?それをどうすればできますか?
ありがとうございます。

+0

表示されているコードには特定の問題がありますか? –

+0

私の唯一の問題は、firebaseが非同期であるため、実際にはユーザーキーなしで2番目の関数を実行します。私はユーザーキーを待つ必要があります –

答えて

1

CheckAndCreate機能から約束を返さなければなりません。約束の仕方を学ぶ。彼らはnodejsで働いている間、あなたを助けます。

私はあなたのコードがあなたが望むものを達成するために構造化されるべき方法を以下に示しました。私は、約束の連鎖を利用して、あなたのコードのいくつかをリファクタリングしました。これにより、コードが読みやすくなります。

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