2017-07-17 67 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. 您是await -ing在ref通話,這不是異步。
  2. 您正在使用on('value'),它發出一個值的流,而不是一次讀取。
  3. 當異步/等待應使用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); 
    } 
}