2016-02-29 58 views
0

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

它看起來像合作mposed函數沒有返回highland stream

回答

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); 

順便說一句,您使用的parallelmerge的一個原因?如果處理文件的順序無關緊要,請使用merge