我正在尝试承诺和异步功能。目前,我有一个脚本,该脚本应该读取文件 filenames.txt
以获取文件名列表,并将其作为数组解析,以便另一个readFile
可以读取每个文件的内容并将其记录到控制台。控制台以某种方式获得undefined
。
这是我的代码:
var Promise = require('bluebird');
var fs = require('fs');
var path = require('path');
getFilenames = function(){
return new Promise((resolve, reject) => {
fs.readFile('filenames.txt', 'utf8', (err,data) => {
if(err) return reject(err);
resolve(data);
});
});
}
getFilenames().then(fileNames => {
fileNames = fileNames.substr(0,fileNames.length-1).split(' ');
Promise.all(fileNames.map(file => {
return new Promise((resolve, reject) => {
fs.readFile(path.join('./',file), 'utf8', (err, data) => {
if (err) return reject (err);
resolve(data);
});
});
}));
}).then(values => console.log(values)).catch((err) => console.log(err));
您不会从第一个then
返回任何内容。您需要返回Promise.all
的结果。这将导致第二个then
等到您在map
结果中创建的承诺数组将被解决,所有这些都将被第一个拒绝的值拒绝。return reject(err)
也是一个无用的语句,您无法从Promise
中返回任何内容,因此只需使用
if (err) reject (err)
。
代码
getFilenames().then(fileNames => {
fileNames = fileNames.substr(0,fileNames.length-1).split(' ');
return Promise.all(fileNames.map(file => {
return new Promise((resolve, reject) => {
fs.readFile(path.join('./',file), 'utf8', (err, data) => {
if (err) {
reject (err);
}
resolve(data);
});
});
}));
}).then(values => console.log(values)).catch((err) => console.log(err));