5

我在 Redis 中有一组电影 ID: [1,2,3,4]和一组带有实际数据的哈希值。现在,我想一次性获取 ID 的所有电影数据。

我正在尝试使用蓝鸟承诺,但我被卡住了。到目前为止,我有:

  函数 allMovies() {
    var 电影,movieIds;
    return client.smembersAsync('movies.ids').then(function(ids) {
      电影ID = ID;
      电影 = _.map(movieIds,函数(id){
         变种电影;
         return client.hmgetAsync("movies:" + id, 'title', 'description', 'director', 'year').done(function(data) {
           电影=数据;
           返回 {
                 标题:数据[0],
                 描述:数据[1],
                 导演:数据[2],
                 年份:数据[3]
               };
          });
          返回电影;
        });
    })

问题在于我的尝试,我总是得到一个新的承诺,而在所有操作完成后我只对 JSON 感兴趣。

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

4

2 回答 2

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]
        };
    });
}
于 2013-10-19T14:19:03.463 回答
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);
    })
于 2013-10-18T00:31:37.993 回答