2015-08-14 148 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. */ 
     }); 
    } 
};