2017-07-19 38 views
0

我正嘗試從Node中的文件中讀取數據。這裏是我的代碼:爲什麼我的readFileSync函數不能執行?

const cheerio = require('cheerio'); 

var fs = require('fs'); 
var path = process.argv[2]; 

var glossArr = [] 

fs.readFileSync(path, {encoding: "utf8"}, function (err, markup){ 
    console.log('function executing') 
    if (err) throw err; 
    const $ = cheerio.load(markup); 
    var glossar = $('body').children().last(); 
    var index = $('body').children().last().prev(); 


    glossar.children().children().children().each(function(i, elem) { 
    var obj = {}; 
     var container = $(this).children(); 

    var unter = container.children(); 
    var begriff = unter.first().text(); 
    var text = unter.last().text(); 
    obj[begriff] = text; 
    obj['file'] = path; 
    glossArr.push(obj) 
    });  

}); 

console.log('done reading file...') 

var glossString = JSON.stringify(glossArr) 
var result = 'export default ' + glossString 

fs.writeFileSync('./data/data.js', result) 

由於某種原因,readFileSync根本不執行。唯一被記錄的是'完成讀取文件...'

但是,當我將其更改爲readFile()(而不是同步)時,該函數按預期執行並正常工作。我錯過了什麼?

回答

4

readFileSync不接受回調參數,因爲它是同步的。你需要改變你的代碼,該代碼從回調中移動的同步功能之下:

var markup = fs.readFileSync(path, {encoding: "utf8"}); 
const $ = cheerio.load(markup); 
// ... 

爲了澄清,該readFileSync被執行,它只是你沒有做任何事情,結果並且您的回調參數被忽略。

+0

意見:您似乎掌握了異步代碼和回調,這是在Node中編程的鼓勵方法。你可能只想堅持,而不是改變方法到同步 – CodingIntrigue

+1

在這種特殊情況下,這是真的不需要,但我通常會 –

+0

當然,感謝您捕捉! –

0

fs.readFileSync同步版本的fs.readFile()。返回路徑的內容 一旦內容返回,您可以執行您想要執行的任務。 瞭解更多使用以下鏈接readFileSync

相關問題