2017-07-17 69 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); 
    } 
}