2014-06-25 44 views
0

來到這裏一noob問題...但首先,有點背景資料...建立在節點/快遞一個數據對象,並通過對象呈現模板

我已經開始編碼與快遞JS應用,雖然我一點一點地掌握了它,但我碰到了一堵磚牆......

我有一個CodeIgniter背景,並且在CI中,您在控制器中創建了一個$ data變量,所有您需要將數據傳遞給您要呈現的頁面。

所以我試圖在Express中做同樣的事情......但我沒有看到如何正確地做到這一點。

例如,

我有這樣一段代碼在一個名爲「routes.js」:

//when you navigate to domain.com/test 
app.get('/test', function(req, res) 
{ 
    //object where i want to store all my data 
    var data = {}; 

    //dynamically get the navigation menu 
    navigation_model.get_menu(function(err, result){ 

      if(err) throw err; 

      //add the result, which is an object, to the data obj 
      data.navigation = result; 
    }); 


    content_model.findAll(function(err, result){ 

      if(err) throw err; 

      //add the result, which is an object, to the data obj 
      data.content = result; 
    }); 

    //page that i want to send the data to 
    res.render('test_view',{data: this.data}); 

}); 

說我有但問題是,做異步性質節點的,到時候我渲染出的頁面,我的「數據」的對象還沒有從型號上接收到的數據...

問題:

  1. 那麼將數據導入'data'obj的最佳方式是什麼?
  2. 我是否必須在回調函數內嵌套代碼,在更多的回調函數中,直到我的數據obj已經收到數據? (感覺適得其反)

任何幫助非常感謝!

+1

你不需要嵌套,但你需要等待一切到達之前,你可以運送它(物理)。你將最終從回調中調用渲染,而不是從get函數體中調用渲染器。 – dandavis

回答

1

原因數據爲空是因爲功能使用getMenu &的findAll是異步的,即之前使用getMenu &的findAll能夠完成它的執行,並填充approprivate值數據的渲染調用正在發生的事情。

修復它的一種方法是在第一個等的回調中調用第二個函數。

navigation_model.get_menu(function(err, result){ 

    if(err) throw err; 

    //add the result, which is an object, to the data obj 
    data.navigation = result; 

    content_model.findAll(function(err, result){ 

      if(err) throw err; 

      //add the result, which is an object, to the data obj 
      data.content = result; 

      res.render('test_view',{data: this.data}); 
    }); 

}); 

一個更好的計算策略是通過使用瀑布使用async圖書館中並行或瀑布方法在prallel或一前一後運行geMenu &的findAll然後調用渲染方法。