[英]Read files in series with fs.readFile in Node?
我有一個任意數量的文件路徑作為字符串存儲在數組中。
我需要依次讀取這些文件(即在開始讀取下一個文件之前先完成讀取一個文件),並在讀取每個文件后輸出文件長度。 在讀取完所有文件后,打印'done'
。
我只允許使用fs.readFile
和本機Javascript。 不允許使用fs.readFileSync
或任何其他模塊。 另外,我在Node v6上,所以不能使用async / await。
有沒有遵循約束的方法來實現功能?
您不需要任何承諾,例如promise,async / await,生成器之類的東西就可以實現它。
function readAllFiles(list) {
if(list.length == 0) return
console.log('reading ', list[0])
return fs.readFile(list[0], function (err, file) {
if (err) console.error(err); // report the error and continue
console.log('list[0]' length:', file.length); // report the file length
readAllFiles(list.slice(1, list.length))
})
}
var l = ['1', 'foo', 'bar']
readAllFiles(l)
在Node中與fs.readFile同步讀取文件?
沒有。
異步函數是異步的。
它們不能變成同步功能。
即使可以使用await
(已排除),它也仍然是異步的,只是使用語法可以讓您在仍然異步的更廣泛的上下文中以同步樣式編寫代碼。
許多JavaScript是異步的。 接受它。 精益使用Promises。 不要試圖與之抗爭。
我需要按順序讀取這些文件(即在開始讀取下一個文件之前先完成讀取一個文件),並在讀取每個文件后輸出文件長度。 讀取完所有文件后,打印“完成”。
編寫一個沿數組迭代的遞歸函數。 讀取文件后,根據您是在數組的末尾還是現在,增加迭代器並遞歸或打印完成 。
嘗試使用generators
。 在示例代碼中,替換acync函數以讀取文件。
// emulate async action const stt = (resolve, str) => { setTimeout( () => { console.log(str); resolve(str); }, 2000 ); } // Create array of functions that return Promise const arrFunc = ['foo', 'bar', 'baz', 'qux'] .reduce( (acc, str) => { acc.push(() => { return new Promise(resolve => { stt(resolve, str); }); }); return acc; }, [] ); function* generator() { for (let func of arrFunc) { yield func(); } } const iterator = generator(); function quasiCo(generator, value) { const next = generator.next(); console.log(next); if (!next.done) { next.value.then(res => { quasiCo(generator, res); }); } } quasiCo(iterator);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.