如何使用compose表示函数链?

时间:2016-02-29 21:54:31

标签: node.js function-composition highland.js

我正在使用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

2 个答案:

答案 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