我在Redis中有一组电影ID:[1,2,3,4]
和一组包含实际数据的哈希值。现在,我想一次获取ID的所有电影数据。
我正在尝试使用蓝鸟,但我被卡住了。到目前为止,我有:
function allMovies() { var movies, movieIds; return client.smembersAsync('movies.ids').then(function(ids) { movieIds = ids; movies = _.map(movieIds, function(id) { var movie; return client.hmgetAsync("movies:" + id, 'title', 'description', 'director', 'year').done(function(data) { movie = data; return { title: data[0], description: data[1], director: data[2], year: data[3] }; }); return movie; }); })
问题来自于我的尝试,我总是得到一个新的承诺,而我只是在所有操作完成后对JSON感兴趣。
这里的任何人都可以对此有所了解吗?
答案 0 :(得分:13)
在蓝鸟中,有一种更含糖的方式:
function allMovies() {
return client.smembersAsync("movies.ids").map(function(id){
return client.hmgetAsync( "movies:" + id, 'title', 'description', 'director', 'year');
}).map(function(data){
return {
title: data[0],
description: data[1],
director: data[2],
year: data[3]
};
});
}
答案 1 :(得分:1)
如果Bluebird在这个问题上与Q保持一致,那么只需要接受一系列承诺并将其转化为结果数组的承诺。请注意,在您的示例中添加了Q.all
,在处理程序中添加了返回,并使用then
代替done
来链接电影承诺。
function allMovies() {
var movies, movieIds;
return client.smembersAsync('movies.ids').then(function(ids) {
movieIds = ids;
movies = _.map(movieIds, function(id) {
var movie;
return client.hmgetAsync("movies:" + id, 'title', 'description', 'director', 'year')
.then(function(data) {
return {
title: data[0],
description: data[1],
director: data[2],
year: data[3]
};
});
});
return Q.all(movies);
})