如何从嵌套的诺言中返回值?
我在Redis中有一组电影ID: [1,2,3,4]
和一组具有实际数据的哈希值。 现在,我想一次获取所有ID的电影数据。
我正在尝试使用蓝鸟promisses,但我卡住了。 到目前为止,我有:
函数allMovies(){ var电影,movieIds; 返回client.smembersAsync('movies.ids')。then(function(ids){ movieIds = ids; movies = _.map(movieIds,function(id){ var电影; return client.hmgetAsync(“movies:”+ id,'title','description','director','year')。done(function(data){ 电影=数据; 返回{ 标题:data [0], 描述:data [1], 导演:资料[2], 年份:数据[3] }; }); 返回电影; }); })
问题出在我所尝试的方面,我总是得到一个新的承诺,而所有的操作完成后,我只是对JSON感兴趣。
这里的任何人都可以解释一下这个问题?
在蓝鸟中,有一个更甜蜜的方式来做到这一点:
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] }; }); }
如果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); })