准备就绪时执行一个promise数组

我如何获得只有在连接完成后执行的承诺?

var fs = require('fs'); var testFolder = './lib/'; var files = ['hello.txt', 'goodbye.txt']; var contents = ''; //creating array of promises let promises = files.map(async e => { return await fs.readFile(testFolder + e, "utf8", function (err, content) { contents += content + ".\n"; }); } ); console.log(promises); //this should happen last but "contents" is still empty string? Promise.all(promises).then(()=> console.log(contents)); 

fs.readFile不返回承诺。

你应该使用util.promisify来做到这一点。

此外,正如下面评论中PatrickHübl-Neschkudla所提到的那样,不需要使用async / await因为readFile已经返回一个promise,直到后面我们才会处理结果。

Bergi还在评论中指出, fs.readFilecallback不能保证以创build顺序返回。 事实上,对于大多数fs操作来说,情况就是这样,因为其他进程总是可以通过同时操作文件来干扰你的 – 例如,如果有人写入一个你将要读取的文件呢?

一旦所有读取完成,您应该执行连接,而不是在发生时执行连接(因为它们可能不同步)。

这也将确保无论承诺(文件读取)失败都能正确捕获所有拒绝 。

 const readFile = util.promisify(fs.readFile); Promise.all( files.map(e => readFile(testFolder + e, "utf8")) ) .then(contentArray => contentArray.join('.\n')) .then(console.log);