如何从嵌套的promise中返回值?

时间:2013-10-17 22:03:25

标签: node.js redis promise bluebird

我在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感兴趣。

这里的任何人都可以对此有所了解吗?

2 个答案:

答案 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);
    })