Использование задачи, futurize, и проходимую список, вы можете просто сделать
async function printFiles() {
const files = await getFiles();
List(files).traverse(Task.of, f => readFile(f, 'utf-8'))
.fork(console.error, console.log)
}
Вот как вы» d установить это значение
import fs from 'fs';
import { futurize } from 'futurize';
import Task from 'data.task';
import { List } from 'immutable-ext';
const future = futurizeP(Task)
const readFile = future(fs.readFile)
Anot ее способ структурировали нужный код будет
const printFiles = files =>
List(files).traverse(Task.of, fn => readFile(fn, 'utf-8'))
.fork(console.error, console.log)
Или, возможно, даже более функционально ориентированных
// 90% of encodings are utf-8, making that use case super easy is prudent
// handy-library.js
export const readFile = f =>
future(fs.readFile)(f, 'utf-8')
export const arrayToTaskList = list => taskFn =>
List(files).traverse(Task.of, taskFn)
export const readFiles = files =>
arrayToTaskList(files, readFile)
export const printFiles = files =>
readFiles(files).fork(console.error, console.log)
Тогда из родительской функции
async function main() {
/* awesome code with side-effects before */
printFiles(await getFiles());
/* awesome code with side-effects after */
}
Если вы действительно хотели больше гибкости в кодировании , вы могли бы просто сделать это
import { curry, flip , compose } from 'ramda'
export const readFile = f => compose (
flip,
curry,
future,
fs.readFile
)
const readFileUtf8 = readFile('utf-8')
PS - Я не пробовал этот код на консоли, возможно, некоторые опечатки ... «прямой фристайл, с вершины купола!» как сказали бы дети 90-х годов. :-p
Не могли бы вы объяснить, почему работает 'for ... of ...'? – Demonbane
ok Я знаю, почему ... Использование Babel преобразует 'async' /' await' в функцию генератора, а использование 'forEach' означает, что каждая итерация имеет отдельную функцию генератора, которая не имеет ничего общего с другими. поэтому они будут выполняться независимо и не имеют контекста 'next()' с другими.Фактически, простой цикл 'for()' также работает, потому что итерации также находятся в одной функции генератора. – Demonbane
@ Demonbane: Короче говоря, потому что он был разработан для работы :-) 'await' приостанавливает текущую * функцию * оценку, включая все структуры управления. Да, он очень похож на генераторы в этом отношении (поэтому они используются для полифония async/await). – Bergi