我试图在异步fileRead上链接promises但我得到undefined

时间:2017-09-25 18:16:37

标签: javascript node.js asynchronous promise

我正在试验承诺和异步函数。现在我有一个脚本应该读取文件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));

1 个答案:

答案 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));