2013-10-17 39 views
5

Tôi có một bộ ID phim trong Redis: [1,2,3,4] và một bộ băm với dữ liệu thực tế. Bây giờ, tôi muốn lấy tất cả dữ liệu phim cho các ID cùng một lúc.Cách trả về giá trị từ lời hứa lồng nhau?

Tôi đang cố gắng sử dụng promebes bluebird, nhưng tôi đã bị mắc kẹt. Cho đến nay, tôi có:

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

Vấn đề là từ những gì tôi cố gắng, tôi luôn lấy lại lời hứa mới, trong khi tôi chỉ quan tâm đến JSON sau khi tất cả các hoạt động đã kết thúc.

Bất kỳ ai ở đây đều có thể làm sáng tỏ điều này?

Trả lời

13

Trong bluebird, có một cách ngọt ngào hơn để làm điều này:

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 .. bản đồ dường như không hoạt động. Tôi nhận được: – poseid

+0

{isFulfilled: true, isRejected: false, completalGiá trị: [], từ chốiReason: undefined} – poseid

+1

@poseid bạn đang sử dụng hàm 'allMovies()' như thế nào? Nếu bạn đang sử dụng nó như 'allMovies(). Sau đó (function (movies) {console.log (movies)})' thì đó là một lỗi nghiêm trọng. Tuy nhiên, nó thực sự trông giống như bạn đang sử dụng nó như 'console.log (allMovies())' - chức năng không trả lại các bộ phim nó trả về một lời hứa cho phim. – Esailija

1

Nếu Bluebird nhất quán với Q về vấn đề này, đó chỉ là vấn đề lấy lời hứa của bạn và biến chúng thành lời hứa cho một loạt kết quả. Lưu ý việc thêm Q.all vào ví dụ của bạn, sự trở lại bên trong trình xử lý và việc sử dụng then thay vì done để chuỗi lời hứa của phim.

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

nhờ, có cái gì đó làm việc với gợi ý này. – poseid

+0

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

Các vấn đề liên quan