为什么Firebase Web数据库读取方法.once有.then方法,但.on不是?

时间:2017-06-16 13:57:25

标签: javascript firebase asynchronous web

我一直在努力理解为什么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条记录,不确定这是否有所不同)?

对任何不明确的问题,陈述或代码表示歉意,并提前感谢您提供的任何见解!

0 个答案:

没有答案