我正在试验承诺和异步函数。现在我有一个脚本应该读取文件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));
答案 0 :(得分:1)
你不会从第一个then
返回任何内容。您需要返回Promise.all
的结果。这将导致第二个then
等待,直到您在map
的结果中创建的promises数组将被解析,所有将被拒绝的第一个被拒绝的值。另外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));