5

Redis には映画の ID の [1,2,3,4]セットと、実際のデータを含むハッシュのセットがあります。ここで、ID のすべての動画データを一度に取得したいと考えています。

ブルーバードの約束を使おうとしていますが、行き詰まりました。これまでのところ、私は持っています:

  関数 allMovies() {
    var ムービー、movieIds;
    return client.smembersAsync('movies.ids').then(function(ids) {
      movieIds = ID;
      ムービー = _.map(movieIds, function(id) {
         var ムービー;
         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 と一致している場合、それは、promise の配列を取り、それらを結果の配列の promise に変換するだけの問題です。あなたの例への追加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 に答える