Giống như phản ứng của @ Bergi, nhưng với một sự khác biệt.
Promise.all
từ chối tất cả các lời hứa nếu một người bị từ chối.
Vì vậy, sử dụng một đệ quy.
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
nằm ngoài printFiles
nguyên nhân gây ra tác dụng phụ * được giới thiệu bởi console.log
, tốt hơn là nên chế giễu, kiểm tra và hoặc gián điệp, vì vậy, thật tuyệt khi có chức năng trả về nội dung (sidenote).
Do đó, mã có thể được thiết kế đơn giản theo đó: ba hàm riêng biệt "thuần túy" ** và không có tác dụng phụ, xử lý toàn bộ danh sách và có thể dễ dàng sửa đổi để xử lý các trường hợp thất bại.
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)
Chỉnh sửa trong tương lai / trạng thái hiện tại
Node hỗ trợ sự chờ đợi cấp cao nhất (điều này chưa có plugin, sẽ không có và có thể được kích hoạt thông qua các cờ hài hòa), thật tuyệt nhưng không giải quyết được một vấn đề (về mặt chiến lược tôi chỉ làm việc trên các phiên bản LTS). Làm thế nào để có được các tập tin?
Sử dụng thành phần. Đưa ra mã, gây cho tôi cảm giác rằng đây là bên trong một mô-đun, vì vậy, nên có một chức năng để làm điều đó. Nếu không, bạn nên sử dụng IIFE để bọc mã vai trò thành hàm async tạo mô-đun đơn giản phù hợp với bạn hoặc bạn có thể đi đúng cách, có, thành phần.
// more complex version with IIFE to a single module
(async (files) => readFiles(await files())(getFilesPath)
Lưu ý rằng tên của các biến thay đổi do ngữ nghĩa. Bạn vượt qua một functor (một hàm có thể được gọi bởi một hàm khác) và nhận một con trỏ trên bộ nhớ có chứa khối logic ban đầu của ứng dụng.
Nhưng, nếu không phải là một mô-đun và bạn cần xuất logic?
Bọc các chức năng trong một chức năng không đồng bộ.
export const readFilesQueue = async () => {
// ... to code goes here
}
Hoặc thay đổi tên của các biến, bất cứ điều gì ...
*
bởi tác dụng phụ sẽ tạo ra bất kỳ hiệu ứng vi khuẩn nào của ứng dụng có thể thay đổi trạng thái / hành vi hoặc lỗi xâm nhập trong ứng dụng, như IO.
**
bởi "thuần túy", đó là dấu nháy đơn vì các chức năng không thuần túy và mã có thể được hội tụ thành phiên bản thuần túy, khi không có đầu ra giao diện điều khiển, chỉ có các thao tác dữ liệu.
Bên cạnh đó, để thuần túy, bạn sẽ cần phải làm việc với các đơn vị xử lý hiệu ứng phụ, dễ bị lỗi và xử lý riêng lỗi đó của ứng dụng.
for ... of ...
làm việc?