1

我目前正在实现一个 javascript 函数来判断用户 ID 和名称是否匹配。

function name_match(user_id, user_realname) {
    var dbref = firebase.database().ref();
    var namesref = dbref.child("names");
    namesref.on("value", function(snapshot) {
        snapshot.forEach(i => {
            if(i.key == user_id && i.child("realname").val() == user_realname) {
                return true;
            }
        });
    });
    return false;
}

但是,无论输入如何,它最初都会返回 false。我认为这是因为在加载 firebase 数据时它会“返回 false”。

因此,即使最终返回 true,由于第一次返回值为 false,它也会导致这样的问题(在另一个函数中)。

function name_match2() {
    var user_id = document.getElementById("user-id").value;
    var user_realname = document.getElementById("user-realname").value;
    if(!name_match(user_id, user_realname)) return -1;
    return 0;
}

它会返回-1。

你能解释一下如何解决这个问题吗?

4

2 回答 2

3

正如 Daniel 在评论中解释的那样,外部函数永远不会返回 true。异步解决方案可能是这些:)

function name_match(user_id, user_realname) {
    return new Promise(function (resolve, reject) {
      var dbref = firebase.database().ref();
      var namesref = dbref.child("names");
      namesref.on("value", function(snapshot) {
          var matched = false;
          snapshot.forEach(i => {
              if(i.key == user_id && i.child("realname").val() == user_realname) {
                  matched = true;
              }
          });

          if (matched) {
             resolve()
          } else {
             reject()
          }
      });
    });
}

在调用函数的另一边

name_match('userId', 'userName').then(function(){
//matched
}, function(){
//unmatched
}); 

其他方法是使用回调:

function name_match(user_id, user_realname, cb) {
      var dbref = firebase.database().ref();
      var namesref = dbref.child("names");
      namesref.on("value", function(snapshot) {
          var matched = false;
          snapshot.forEach(i => {
              if(i.key == user_id && i.child("realname").val() == user_realname) {
                  matched = true;
              }
          });

          cb(matched);
    });
}

在这种情况下:

name_match('userId', 'userName', function(matched) {
    console.log(matched);
})
于 2019-06-19T10:57:02.717 回答
0

这是 Suryapratap 解决方案的一个小改编,使用该once()方法,

  1. “只侦听一个指定事件类型的事件,然后停止侦听。”,和
  2. 返回一个承诺

...而不是使用on()设置监听器的方法。

function name_match(user_id, user_realname) {

      var dbref = firebase.database().ref();
      var namesref = dbref.child("names");

      return namesref.once('value').then(function(snapshot) {
          var matched = false;
          snapshot.forEach(i => {
              if(i.key == user_id && i.child("realname").val() == user_realname) {
                  matched = true;
              }
          });
          return matched;
      });

}
于 2019-06-19T12:00:31.293 回答