2017-09-25 66 views
-1

我正在試驗承諾和異步函數。現在我有一個腳本,它應該讀取一個文件名爲filenames.txt的文件並將其解析爲數組,以便另一個readFile可以讀取每個文件的內容並將其記錄到控制檯。不知怎的,控制檯得到undefined我試圖在異步fileRead上鍊承諾,但我得到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

之前'Promise.all' – Shaharyar

回答

1

你不從第一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)); 
+0

該訣竅只要把'return'。謝謝! – medicengonzo

+0

我也沒有得到'downvote'。等待原因.. – Shaharyar