Если у нас есть:
fn1() {
[filepath1, filepath2, ..., filepathN].forEach(process);
function process(path) {
fs.readFile(file, translate);
}
}
Обратный вызов translate
- это то, что работает с содержимым каждого файла.
Как мы это сделаем, получим обещание, чтобы мы могли делать fn1().then(fn2)
?
Если есть хорошее решение, использующее async await
что это тоже здорово.
fn2()
должен ждать, пока все пути файла в массиве, используемом fn1
, будут обработаны.fn1()
, вероятно, вернется, прежде чем все файлы будут обработаны, поскольку fs.readFile() является асинхронным... IIUC? ' Вы можете использовать await
внутри for..of
цикла:
async fn1() {
for (path of [filepath1, filepath2, ..., filepathN]) {
await new Promise((resolve) => {
fs.readFile(path, (err, data) => {
translate(err, data);
resolve();
});
});
}
}
fn1
, будучи асинхронной функцией, автоматически возвращает Promise, которая разрешается после завершения всех итераций, поэтому вы можете использовать fn1().then(fn2)
.
Если вы хотите readFile
параллельно, а не последовательно, то лучше map
на map
каждый вызов readFile
в массив обещаний, а затем использовать Promise.all
:
fn1() {
const arr = [filepath1, filepath2, ..., filepathN];
return Promise.all(arr.map(path => new Promise((resolve) => {
fs.readFile(path, (err, data) => {
translate(err, data);
resolve();
});
})));
}