我一直在努力理解为什么Firebase Web读取方法.once具有.then方法而.on不具备。
Here's a link to the code reference
Here's a link to the official docs
根据我对阅读Firebase Web文档的理解,.once方法有一个.then()方法,因此一旦检索到它就可以返回数据的承诺,因为对数据库的调用是异步的。
//Method to call
var readUserData = function (uid) {
return firebase.database().ref('users/' + uid).once('value').then(function(snapshot){
var user = snapshot.val();
return user;
});
};
//How I call the method
readUserData(uid).then(function(userData){
//Do things with the data
});
这很容易理解,我可以使用.then等待我的数据,并在获得数据后继续进行同步操作。我也无法在.then之外返回数据,因为数据将是未定义的。
使用.on函数,我创建了一个这样的函数:
function readAllJobData() {
return firebase.database().ref('jobs').on('value', function(snapshot){
var field, obj, jobArray = [];
tempObj = Object.entries(snapshot.val()); // Gets the individual entries in the snapshot
for(field in tempObj){
obj = JSON.parse(JSON.stringify(tempObj[field][1])); // Parses the JSON for each job and its data
console.log(obj.name);
jobArray.push(obj);
}
return jobArray;
});
}
我不能这样调用这个函数,
readAllJobData().then(function(data){//use data});
因为.then()不作为.on
的方法存在如果我这样调用函数,
var jobData = readAllJobData();
返回回调函数 - 它无法访问像.once那样的获取数据,因此会抛出错误。
现在,当我创建这样的函数时,
var readAllJobData = function() {
var jobArr = [];
firebase.database().ref('jobs').on('value', function(snapshot){
var field, obj;
tempObj = Object.entries(snapshot.val()); // Gets the individual entries in the snapshot
for(field in tempObj){
obj = JSON.parse(JSON.stringify(tempObj[field][1])); // Parses the JSON for each job and its data
console.log(obj.name); //Logs what I wanted first
jobArr.push(obj);
}
});
console.log("jobArr",jobArr); //Logs what I wanted second
return jobArr; //returns expected array
};
我称之为,
var jobData = readAllJobData();
控制台正确输出'obj.name',然后正确输出'jobArr',并为jobData分配我需要的数组。这看起来很奇怪,因为如果在这种情况下使用.once,这将无效。
重申一下这个问题,为什么只有.once方法,而不是.on方法呢?在我看来,两种方法都应该对它们异步检索的数据做出承诺。这使我不确定如何使用.on调用数据库。我是否必须使用.on进行硬编码(进行调用并使用回调来调用特定方法)任何读取方法,或者是否有更好/首选的方法来使用.on进行读取?
另外,为什么.on方法看起来好像是在同步执行,如上面最接近的例子所示?函数似乎可以同步工作,因为对数据库的调用速度非常快,而且数据很少(我现在只返回2条记录,不确定这是否有所不同)?
对任何不明确的问题,陈述或代码表示歉意,并提前感谢您提供的任何见解!