如何从嵌套的诺言中返回值?

我在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); })