我正在使用highlandjs
库来读取文件并在其内容中添加结束卡,然后在控制台中显示它们:
const readFile = highland.wrapCallback(fs.readFile);
const addEndCard = x => x + '\nx---THE END---x\n';
files.map(readFile).parallel(3).map(addEndCard).each(console.log);
我想用highland.compose
将这些包装成单个函数调用,我开始于:
const readAllFiles = highland.compose(
highland.map,
addEndCard,
readFile
);
readAllFiles(files).parallel(3).each(console.log);
我收到错误:
TypeError: readAllFiles(...).parallel is not a function
at Object.<anonymous> (/home/vamsi/Do/highland-fun/index.js:14:21)
at Module._compile (module.js:398:26)
at Object.Module._extensions..js (module.js:405:10)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Function.Module.runMain (module.js:430:10)
at startup (node.js:141:18)
at node.js:980:3
看起来组合函数没有返回highland stream
。
答案 0 :(得分:0)
readFile
返回一个流,但_.compose()组成的功能不是流。
我相信您正在寻找的是_.pipeline()。
答案 1 :(得分:0)
你的组合函数没有返回流的原因是,通过传递map
,你正在使用一个期望两个参数的curried函数。 compose
通过将每个函数从右到左依次应用的结果传递,即组合中的每个函数必须是一元的;当map
收到一个参数时,它返回一个期望最终参数而不是结果的函数,并且它会破坏下游的其余函数。这样的事情应该有效:
highland(files) // I presume files is an array
.map(highland.compose(highland.map(addEndCard), readFile))
.parallel(3)
.each(console.log);
另外,我维护原始API的唯一方法是:
const readAllFiles = highland.compose(
highland.map(highland.map(addEndCard)),
files => files.map(file => readFile(file))
);
readAllFiles(files).parallel(3).each(console.log);
顺便说一句,您使用parallel
而不是merge
是有原因的吗?如果处理文件的顺序无关紧要,请使用merge
。