在数据库操作后如何确保我的视图呈现?

时间:2015-12-18 17:20:43

标签: json node.js redis

我是Node和Redis的新手,我已经坚持了很长一段时间了。

我有一个从Redis数据库填充的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
})

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

最后一个参数看起来像回调,所以你可以将它放在

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
          })
        }
    })
}

编辑:(在表示赞赏之后),这取决于您将使用的承诺实施,但我会根据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
          })
})

答案 1 :(得分:0)

如上所述,您应该能够将其传递给redisClient回调。但是,如果您的代码变得更复杂或嵌套,您可能会考虑使用promises。