2013-10-17 16 views
5

Ho un set di ID di film in Redis: [1,2,3,4] e un set di hash con i dati effettivi. Ora, voglio recuperare tutti i dati del film per gli ID in una volta.Come restituire i valori dalla promessa nidificata?

Sto cercando di usare le bluebird promisses, ma mi sono bloccato. Finora, ho:

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

Il problema è da quello che cerco, che ho sempre tornare una nuova promessa, mentre io sono solo interessati a un JSON dopo tutte le operazioni hanno finito.

Chiunque qui può far luce su questo?

risposta

13

In Bluebird, c'è un modo più zuccherino di fare questo:

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 .. la mappa non sembra funzionare. Ottengo: – poseid

+0

{isFulfilled: true, isRejected: false, fulfillmentValue: [], rifiuto: ragionevole: – poseid

+1

@poseid come stai usando la funzione 'allMovies()'? Se lo si utilizza come 'allMovies(). Then (function (movies) {console.log (movies)})' allora questo è un bug grave. Tuttavia, sembra proprio che lo si stia usando 'console.log (allMovies())' - la funzione non restituisce i film restituisce una promessa per i film. – Esailija

1

Se Bluebird è coerente con Q su questo problema, è solo una questione di prendere la serie di promesse e trasformarle in una promessa per la gamma di risultati. Notare l'aggiunta di Q.all all'esempio, il ritorno all'interno del gestore e l'uso di then anziché done per concatenare la promessa del film.

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

grazie, ha qualcosa a lavorare con questo suggerimento. – poseid

+0

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

Problemi correlati