2017-07-17 8 views
0

Firebaseからデータを取得していますが、コードがデータを待たずに実行されていて、後でデータを取得します。私は非同期を待っていますが、それでも...何が間違っていますか?ありがとう!Javascriptはfirebaseデータがロードされるのを待ちません

var interlocutor = this.getRandomInterlocutor(); 
 
    FriendlyChat.prototype.getRandomInterlocutor = async function(){ 
 
    var numberOfUsers = await this.getNumberOfUsersRef(); 
 

 
    console.log('numberOfUsers = ' + numberOfUsers); 
 

 
    var randomIndex = Math.floor(Math.random() * numberOfUsers); 
 
    console.log('randomIndex = ' + randomIndex); 
 

 
    var ref = await firebase.database().ref('companies/' + this.company + '/users/'); 
 
    ref.limitToFirst(randomIndex).limitToLast(1).once('value').then(snapshot => 
 
    { 
 
     var user = snapshot.val(); 
 
     console.log('getRandomInterlocutor = ' + user); 
 
    }); 
 

 
    } 
 

 
FriendlyChat.prototype.getNumberOfUsersRef = async function(){ 
 
    var numberOfUsersRef = await firebase.database().ref('companies/' + this.company + '/countregs'); 
 
    var numberOfUsers; 
 

 
    numberOfUsersRef.on('value', function(snapshot) { 
 
     console.log(snapshot.val()); 
 
     numberOfUsers = snapshot.val(); 
 
     return numberOfUsers; 
 
    }, function (errorObject) { 
 
     console.log("The read failed: " + errorObject.code); 
 
    }); 
 
    }

答えて

2

いくつかのことが間違ってここにあります

  1. あなたは非同期ではありませんref呼び出し、上-ing awaitです。
  2. on('value')を使用しています.1回の読み込みではなく、値のストリームが出力されます。
  3. async/awaitでPromisesを使用する必要がある場合は、コールバックスタイルのコードを使用しています。

    FriendlyChat.prototype.getNumberOfUsersRef = async function(){ 
        var numberOfUsersRef = firebase.database() 
        .ref('companies') 
        .child(this.company) 
        .child('countregs'); 
    
        try { 
        var snapshot = await numberOfUsersRef.once('value'); 
        return snapshot.val(); 
        } catch (errorObject) { 
        console.log('The read failed:', errorObject.stack); 
        } 
    } 
    
    :ここ

は、より良いプラクティスを実証するためのあなたの第二の機能の修正版です

関連する問題