2015-08-14 149 views
0

我正在使用EJS模板来渲染页面。我用来呈现网页的数据是从Firebase数据存储区拉出的对象。如何从嵌套函数中返回对象?高阶函数

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

pullFromFirebase()的结果设置为另一个js文件中定义的data变量。我希望Firebase返回的对象框可用于data。最终会将data馈送到我的模板的呈现方法中。

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

同样,如果从控制台调用pullFromFirebase与的内容也返回。从调音台呼叫data();也会返回box

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

// 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

回答

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. */ 
     }); 
    } 
};