我是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
})
提前感谢您的帮助!
答案 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。