Verspricht mit fs und bluebird

Ich bin derzeit lernen, wie man verspricht in nodejs

also meine erste Herausforderung war die Liste der Dateien in ein Verzeichnis und dann die Inhalte der einzelnen mit beiden Schritte unter Verwendung von asynchronen Funktionen. Ich kam mit der folgenden Lösung, aber habe ein starkes Gefühl, dass dies nicht der eleganteste Weg, dies zu tun, vor allem der erste Teil, wo ich "drehen" die asynchronen Methoden in verspricht

//purpose is to get the contents of all files in a directory
//using the asynchronous methods fs.readdir() and fs.readFile()
//and chaining them via Promises using the bluebird promise library [1]
//[1] https://github.com/petkaantonov/bluebird 

var Promise = require("bluebird");
var fs = require("fs");
var directory = "templates"

//turn fs.readdir() into a Promise
var getFiles = function(name) {
    var promise = Promise.pending();

    fs.readdir(directory, function(err, list) {
        promise.fulfill(list)
    })

    return promise.promise;
}

//turn fs.readFile() into a Promise
var getContents = function(filename) {
    var promise = Promise.pending();

    fs.readFile(directory + "/" + filename, "utf8", function(err, content) {
        promise.fulfill(content)
    })

    return promise.promise
}

Nun die Kette verspricht:

getFiles()    //returns Promise for directory listing 
.then(function(list) {
    console.log("We got " + list)
    console.log("Now reading those files\n")

    //took me a while until i figured this out:
    var listOfPromises = list.map(getContents)
    return Promise.all(listOfPromises)

})
.then(function(content) {
    console.log("so this is what we got: ", content)
})

Wie ich oben schrieb, gibt es das gewünschte Ergebnis, aber ich bin mir ziemlich sicher, dass es eine elegantere Art und Weise.

InformationsquelleAutor der Frage Henrik | 2013-10-17

Schreibe einen Kommentar