2015-02-22 12 views
5

Sono nuovo alle promesse e utilizzo dell'implementazione rsvp.Come leggere più file in modo asincrono con promesse, quindi procedere

Voglio leggere in modo asincrono un elenco di file, quindi passare a un'altra attività solo quando tutti i file sono stati letti.

ho per quanto riguarda la struttura di base per leggere un file, e la catena al prossimo compito:

var loadFile = function (path) { 
    return new rsvp.Promise(function (resolve, reject) { 
     fs.readFile (path, 'utf8', function (error, data) { 
      if (error) { 
       reject(error); 
      } 
      resolve(data); 
     }); 
    }); 
}; 

loadFile('src/index.txt').then(function (data) { 
    console.log(data); 
    return nextTask(data); 
}).then(function (output) { 
    //do something with output 
}).catch(function (error) { 
    console.log(error); 
}); 

voglio fare qualcosa di simile:

loadFile(['src/index.txt', 'src/extra.txt', 'src/another.txt']).then(... 

I' ho visto arrays of promises e hash of promises nei documenti, ma non so quale sia più rilevante, o come usarli. Ho bisogno di un esempio del loro uso nel contesto del mio problema sopra per capirli.

risposta

5

che si desidera utilizzare RSVP.all():

var promises = ['path1', 'path2', 'path3'].map(loadFile); 

RSVP.all(promises).then(function(files) { 
    // proceed - files is array of your files in the order specified above. 
}).catch(function(reason) { 
    console.log(reason); // something went wrong... 
}); 

Sentitevi liberi di fare promises un oggetto e utilizzare RSVP.hash() invece:

var promises = { 
    file1: loadFile('path1'), 
    file2: loadFile('path2'), 
    file3: loadFile('path3') 
}; 

RSVP.hash(promises).then(function(files) { 
    // files is an object with files under corresponding keys: 
    // ('file1', 'file2', 'file3') 
}).catch(function(reason) { 
    console.log(reason); // something went wrong... 
}); 

(grazie al @Benjamin Gruenbaum per il suggerimento di utilizzare .map())

+0

Prima di caricare i file, ho un'attività precedente non correlata che restituisce una promessa diversa. Come faccio a incatenare RSVP.all() per attendere questa attività dipendente? – mtmacdonald

+1

Basta chiamare RSVP.all() nella richiamata risoluzione dell'attività precedente. – bardzusny

+0

Non sono riuscito a far funzionare la versione dell'oggetto: [Errore: i metodi di array devono disporre di una matrice]. Non importa - questo è ciò che RSVP.hash è per. – mtmacdonald

Problemi correlati