2015-12-18 57 views
0

我是Node和Redis的新手,我一直堅持這一段時間。如何確保我的視圖在數據庫操作之後呈現?

我有一個正在從Redis DB填充的JSON對象,我想將這個JSON傳遞給一個視圖,以便它正確渲染。不幸的是,視圖在JSON被填充之前被呈現,因此顯示爲空白。

如何確保res.view()在填充Feed之後等待?

這裏是我的代碼:

for(var i=0 ; i<found[0].following.length ; i++) { 
    redisClient.lrange(found[0].following[i], 0, 0, function(err, record){ 
     if(record != []) { 
      console.log("Parsing " + record[0]) 
      feed.push(JSON.parse(record[0])) 
     } 
    }) 
} 
res.view('user/feed', { 
    name: req.session.name, 
    feed: feed 
}) 

在此先感謝您的幫助!

回答

1

末PARAM看起來像回調,所以你可以把它裏面

for(var i=0 ; i<found[0].following.length ; i++) { 
    redisClient.lrange(found[0].following[i], 0, 0, function(err, record){ 
     if(record != []) { 
      console.log("Parsing " + record[0]) 
      feed.push(JSON.parse(record[0])) 
     } 
     if(!err) { 
      res.view('user/feed', { 
      name: req.session.name, 
      feed: feed 
      }) 
     } 
    }) 
} 

編輯:(commets後),這取決於執行的承諾,你會使用,但我給你的想法first I googled基地(雖然不是最完整的實現)

promise = new Promise() 
asyncOperation(function() { 
    var toDo = found[0].following.length; //all lrange jobs you're waiting on 
    for(var i=0 ; i<found[0].following.length ; i++) { 
     redisClient.lrange(found[0].following[i], 0, 0, function(err, record){ 
      if(record != []) { 
       console.log("Parsing " + record[0]) 
       feed.push(JSON.parse(record[0])) 
      } 
      toDo--; 
      if(toDo < 0) { // or = 0, little bit tired here. You'll figure it out I'm sure 
       promise.resolve() 
      } 
     }) 
    } 

}) 
promise.then(function(){ 
      res.view('user/feed', { 
      name: req.session.name, 
      feed: feed 
      }) 
}) 
+0

我試過同樣的事情,但事情是,我想要聚合變量'feed'然後呈現頁面(基本上填充整個數組)。這樣,只有第一個元素被推入數組,並且頁面被髮送到渲染,這不是我想要的。 – madebysid

+0

啊!看看我編輯的答案。 – meta

+0

加上:關於promisses機智的文章鏈接到一些更好的界面庫http://howtonode.org/promises – meta

0

如上所述,您應該能夠將它傳遞給redisClient回調。但是,如果代碼變得更復雜或嵌套,則可以使用promise來代替。

+0

我嘗試使用承諾,但同樣的問題出現。承諾在循環完成之前得到解決。難道我做錯了什麼? – madebysid

相關問題