Suka @ Bergi, tetapi dengan satu perbedaan.
Promise.all
menolak semua janji jika ada yang ditolak.
Jadi, gunakan rekursi.
const readFilesQueue = async (files, index = 0) {
const contents = await fs.readFile(files[index], 'utf8')
console.log(contents)
return files.length <= index
? readFilesQueue(files, ++index)
: files
}
const printFiles async = () => {
const files = await getFilePaths();
const printContents = await readFilesQueue(files)
return printContents
}
printFiles()
PS
readFilesQueue
berada di luar printFiles
sebab efek samping * yang diperkenalkan olehconsole.log
, lebih baik mengejek, menguji, atau memata-matai, tidak keren memiliki fungsi yang mengembalikan konten (sidenote).
Oleh karena itu, kode hanya dapat dirancang dengan itu: tiga fungsi terpisah yang "murni" ** dan tidak menimbulkan efek samping, memproses seluruh daftar dan dapat dengan mudah dimodifikasi untuk menangani kasus yang gagal.
const files = await getFilesPath()
const printFile = async (file) => {
const content = await fs.readFile(file, 'utf8')
console.log(content)
}
const readFiles = async = (files, index = 0) => {
await printFile(files[index])
return files.lengh <= index
? readFiles(files, ++index)
: files
}
readFiles(files)
Sunting / kondisi saat ini di masa depan
Node mendukung top-level menanti (ini belum memiliki plugin, tidak akan memiliki dan dapat diaktifkan melalui bendera harmoni), itu keren tetapi tidak menyelesaikan satu masalah (secara strategis saya hanya bekerja pada versi LTS). Bagaimana cara mendapatkan file?
Menggunakan komposisi. Mengingat kode itu, membuat saya merasa bahwa ini ada di dalam modul, jadi, harus memiliki fungsi untuk melakukannya. Jika tidak, Anda harus menggunakan IIFE untuk membungkus kode peran ke dalam fungsi async membuat modul sederhana yang melakukan semuanya untuk Anda, atau Anda dapat pergi dengan cara yang benar, yaitu, komposisi.
// more complex version with IIFE to a single module
(async (files) => readFiles(await files())(getFilesPath)
Perhatikan bahwa nama variabel berubah karena semantik. Anda melewatkan functor (fungsi yang dapat dipanggil oleh fungsi lain) dan menerima pointer pada memori yang berisi blok awal logika aplikasi.
Tetapi, jika ini bukan modul dan Anda perlu mengekspor logikanya?
Bungkus fungsi dalam fungsi async.
export const readFilesQueue = async () => {
// ... to code goes here
}
Atau ubah nama variabel, apa pun ...
*
by side effect menans efek kolakteral dari aplikasi yang dapat mengubah status / perilaku atau memperkenalkan bug dalam aplikasi, seperti IO.
**
oleh "pure", itu dalam tanda kutip karena fungsi itu tidak murni dan kode dapat dikonversikan ke versi murni, ketika tidak ada output konsol, hanya manipulasi data.
Selain itu, untuk menjadi murni, Anda harus bekerja dengan monad yang menangani efek samping, yang rentan kesalahan, dan memperlakukan kesalahan itu secara terpisah dari aplikasi.
for ... of ...
berhasil?