2017-09-25 5 views
-1

私は約束事と非同期関数を試しています。今すぐ私はファイル名のリストのためにファイルfilenames.txtを読んで、それを配列として解析して、別のreadFileが各ファイルの内容を読んでコンソールに記録するスクリプトを用意しています。どういうわけかコンソールはundefinedになります。私は非同期fileReadで約束を連鎖しようとしていますが、私は定義されていません

これは私のコードです:

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

コードだけでトリックをしたPromise.all' – Shaharyar

答えて

1

あなたが最初thenから何かを返しません。 Promise.allの結果を返す必要があります。 2番目の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)); 
+0

''前return'を置きます。ありがとうございました! – medicengonzo

+0

私は 'downvote'も取得しません。理由を待っている.. – Shaharyar

関連する問題