2013-10-17 27 views
5

我在Redis中有一組電影ID:[1,2,3,4]和一組具有實際數據的散列。現在,我想一次獲取所有ID的電影數據。如何從嵌套的諾言中返回值?

我想使用藍鳥promisses,但我卡住了。到目前爲止,我有:

 
    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

嗯..地圖似乎沒有工作。我得到: – poseid

+0

{isFulfilled:true, isRejected:false, fulfillmentValue:[], rejectReason:undefined} – poseid

+1

@poseid你如何使用'allMovies()'函數?如果你像'allMovies()。然後(函數(電影){console.log(電影)})'使用它,那麼這是一個嚴重的錯誤。但是,它確實看起來像你正在使用它像'console.log(allMovies())' - 該函數不會返回電影,它會返回電影承諾。 – Esailija

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

感謝,得到的東西與這個提示工作。 – poseid

+0

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