Firebase等待回复

时间:2017-07-11 12:48:04

标签: javascript firebase

如果我有这样的东西



const query = firebase.database().ref("/posts").orderByChild('postid').equalTo(1);
query.once('value', snapshot=>{
  if(snapshot.val() == "XYZ"){
    console.log("true");
    return true;
  }
});
console.log("false");
return false




为什么这个印刷是假的真实

如何在跳转到返回false之前强制等待查询的答案?

3 个答案:

答案 0 :(得分:1)

根据您的评论,这可能是您想要做的:

const query = firebase.database().ref("/posts").orderByChild('postid').equalTo(1);
query.once('value', snapshot=>{
  if (snapshot && (snapshot.val() === "XYZ")){
    console.log("true");
    // do something
  }
  else {
    console.log("false");
    // do something else
  }
});

您需要检查快照是否为空。

注意,如果你的代码在一个返回值的函数中,它将无法以你期望的方式工作(即它总是返回false),因为查询是一个异步调用,所以在查询中执行你的逻辑

答案 1 :(得分:1)

任何查询都是承诺,您可以返回承诺。类似的东西:

const promise = query.once ... 返回Promise.all([promise])。

也许你不需要阵列而只是:

返回承诺;

此视频应有助于https://youtu.be/NgZIb6Uwpjc

答案 2 :(得分:0)

这是一个可能有用的片段:

  //DETECTS DUPLICATE DISPLAY NAMES IN USERS BRANCH OF REALTIME DATABASE
  function displayNameExists (email, displayName, password){
    var users = db.ref('users');
    var duplicate = users.orderByChild('displayName').equalTo(displayName);
    duplicate.once('value').then(function(snap) {
      if(snap.val()){
        promptDuplicateName(displayName);
      } else {
        email = email;
        displayName = displayName;
        if(ls){
          localStorage.setItem('displayName', displayName);
        }else{
          // unavailable
        }                
        demoLogin.registerUsername(password);
      }
    }, function(error) {
      // The Promise was rejected.
      toast(error);
    });
  }