2015-02-22 12 views
5

Ich bin neu zu Versprechen und mit der rsvp Implementierung.So lesen Sie mehrere Dateien asynchron mit Versprechungen, dann fahren Sie fort

Ich möchte eine Liste von Dateien asynchron lesen und dann mit einer anderen Aufgabe fortfahren, wenn alle Dateien gelesen wurden.

Ich habe so weit wie die Grundstruktur bekam eine Datei, und die Kette zur nächsten Aufgabe zu lesen:

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

ich so etwas wie dies tun wollen:

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

I‘ Ich habe arrays of promises und hash of promises in den Dokumenten gesehen, aber ich weiß nicht, welches am relevantesten ist, oder wie man sie benutzt. Ich brauche ein Beispiel ihrer Verwendung im Zusammenhang mit meinem obigen Problem, um sie zu verstehen.

Antwort

5

Sie verwenden möchten 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... 
}); 

Fühlen Sie sich frei promises ein Objekt erstellen und verwenden RSVP.hash() statt:

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

(dank @Benjamin Gruenbaum für Vorschlag .map() zu verwenden)

+0

Bevor ich die Dateien lade, habe ich eine nicht verwandte vorherige Aufgabe, die ein anderes Versprechen zurückgibt. Wie würde ich RSVP.all() verketten, um auf diese abhängige Aufgabe zu warten? – mtmacdonald

+1

Rufen Sie einfach RSVP.all() im Callback der letzten Aufgabe auflösen. – bardzusny

+0

Ich konnte die Objektversion nicht zum Laufen bringen: [Fehler: Array Methoden muss ein Array zur Verfügung gestellt werden]. Macht nichts - dafür ist RSVP.hash da. – mtmacdonald