我试图在异步Fileread上链接承诺,但我不确定



我正在尝试承诺和异步功能。目前,我有一个脚本,该脚本应该读取文件 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));

最新更新