Javascript 财政司司长和蓝鸟的承诺

Javascript 财政司司长和蓝鸟的承诺,javascript,node.js,asynchronous,fs,bluebird,Javascript,Node.js,Asynchronous,Fs,Bluebird,我目前正在学习如何在nodejs中使用承诺 因此,我的第一个挑战是列出目录中的文件,然后使用异步函数通过这两个步骤获取每个文件的内容。我提出了以下解决方案,但强烈感觉这不是最优雅的方法,特别是在第一部分,我将异步方法“转化”为承诺 //目的是获取目录中所有文件的内容 //使用异步方法fs.readdir()和fs.readFile() //并使用蓝鸟承诺库通过承诺将它们链接起来[1] // [1] https://github.com/petkaantonov/bluebird var承诺=

我目前正在学习如何在nodejs中使用承诺

因此,我的第一个挑战是列出目录中的文件,然后使用异步函数通过这两个步骤获取每个文件的内容。我提出了以下解决方案,但强烈感觉这不是最优雅的方法,特别是在第一部分,我将异步方法“转化”为承诺

//目的是获取目录中所有文件的内容
//使用异步方法fs.readdir()和fs.readFile()
//并使用蓝鸟承诺库通过承诺将它们链接起来[1]
// [1] https://github.com/petkaantonov/bluebird 
var承诺=要求(“蓝鸟”);
var fs=要求(“fs”);
var directory=“模板”
//将fs.readdir()转换为承诺
var getFiles=函数(名称){
var promise=promise.pending();
fs.readdir(目录,函数(err,list){
履行承诺(清单)
})
回报承诺;
}
//将fs.readFile()转换为承诺
var getContents=函数(文件名){
var promise=promise.pending();
fs.readFile(目录+“/”+文件名,“utf8”,函数(错误,内容){
承诺。履行(内容)
})
回报承诺
}
现在,我们来兑现这两个承诺:

getFiles()//返回目录列表的承诺
.then(功能(列表){
log(“我们得到了”+列表)
console.log(“正在读取这些文件\n”)
//我花了一段时间才弄明白:
var listOfPromises=list.map(getContents)
返还承诺。全部(承诺清单)
})
.然后(功能(内容){
log(“这就是我们得到的:”,内容)
})

正如我在上面所写的,它会返回所需的结果,但我确信有一种更优雅的方法可以实现这一点。

使用和方法可以缩短代码:

事实上,由于功能不再发挥作用,您可以进一步调整:

var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs")); //This is most convenient way if it works for you
var directory = "templates";

fs.readdirAsync(directory).map(function (filename) {
    return fs.readFileAsync(directory + "/" + filename, "utf8");
}).then(function (content) {
    console.log("so this is what we got: ", content)
});

.map
应该是处理集合时的基本方法-它非常强大,因为它适用于从一系列承诺的承诺到进一步的承诺,再到介于两者之间的任何直接值的混合,同时指出,未来读者可以使用
Async
函数:
readdirAsync
readFileAsync
var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs")); //This is most convenient way if it works for you
var directory = "templates";

fs.readdirAsync(directory).map(function (filename) {
    return fs.readFileAsync(directory + "/" + filename, "utf8");
}).then(function (content) {
    console.log("so this is what we got: ", content)
});