如何从嵌套函数中返回对象?高阶函数

时间:2015-08-14 19:55:32

标签: javascript

我正在使用EJS模板来呈现页面。我用来呈现页面的数据是从Firebase数据存储中提取的对象。

访问数据存储的方法是utils对象的属性。数据从Firebase中提取,数据存储中的每个元素都添加到box数组中。

pullFromFirebase()的结果设置为另一个js文件中定义的data变量。我希望Firebase返回的对象框可用于datadata最终会被输入到我的模板的渲染方法中。

尝试在页面加载时通过utils.box变量返回data来访问undefined。我知道box包含来自Firebase的元素;如果我在console.log(box);中的for循环之后pullFromFirebase,则会返回框内容。

同样,如果使用pullFromFirebase从控制台调用utils.pullFromFirebase();,则还会返回box的内容。从控制台调用data();也会返回box

如何通过pullFromFirebase以编程方式访问从data();返回的对象?

// file1.js
var db = new Firebase('firebaseURL');
var data = utils.pullFromFirebase(); // data(); returns 'undefined'


// file2.js
var utils = { 
    pullFromFirebase: function () {

        db.on("value", function(snapshot) {
            var notebook = snapshot.val(); 
            var box = [];

            for (list in notebook) {
                box.push(notebook[list]);
            }
            utils.box = box;
        });

        return utils.box; 
    }
};

utils的任何其他属性都会成功返回。仅返回box个对象。如果我console.dir(utils);,我会将box视为utils的属性及其值。所以,当我看到box时,我无法触及box

1 个答案:

答案 0 :(得分:0)

由于utils.pullFromFirebase正在对数据库进行异步调用,因此它应该至少接受一个回调函数来对box中返回的值执行一些有用的操作。

//file1.js
var db = new Firebase('firebaseURL'), data;
utils.pullFromFirebase(
    function (result) {
        data = result; /* When the call to the database returns, data variable is set to the results of that call. */
    });


//file2.js
var utils = {
    pullFromFirebase: function (callback) {
        db.on("value", function(snapshot) {
            var notebook = snapshot.val();
            var box = [];
            for (list in notebook) {
                box.push(notebook[list]);
            }
            utils.box = box;
            callback(box); /* Callback function is called with the database results. */
        });
    }
};