2013-10-17 22 views
5

私はレディスで映画の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でちょうど興味を持っていながら、私は常に、新しい約束を取り戻すことを、私がしようとするものです。

誰もがこれにいくつかの光を当てることができますか?

答えて

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] 
     }; 
    }); 
} 
+0

を参照してください.hmm ..マップが機能していないようです。私は得る: – poseid

+0

{isFulfilled:true、 isRejected:false、 fulfillmentValue:[]、 rejectionReason:未定義} – poseid

+1

@spellid'どのように 'allMovies()'関数を使いますか? 'allMovies()。(function(movies){console.log(movies)})'のように使っているのなら、それは深刻なバグです。しかし、あなたが 'console.log(allMovies())'のように使用しているように見えます。この関数は映画の約束を返すムービーを返しません。 – Esailija

1

この問題でBluebirdがQと矛盾しない場合は、約束通りに並べて、結果の配列を約束してください。あなたの例にQ.allを追加し、ハンドラ内の戻り値と、doneの代わりにthenを使用して、映画の約束を連鎖させることに注意してください。

青い鳥で
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); 
    }) 
+0

おかげで、このヒントでの作業何かを得ました。 – poseid

+0

https://gist.github.com/mulderp/7045228 – poseid

関連する問題