【发布时间】:2017-04-11 19:17:29
【问题描述】:
任何人都可以提出惯用的函数式方法来处理带有错误日志记录的管道。示例命令式样式(在 JavaScript 中):
const filesToProcess = ['file1.txt','file2.txt','non_existent_file.txt'];
var totalLetterCountImperative = 0;
for (var i = 0; i < filesToProcess.length; i++){
try {
totalLetterCountImperative += fs.readFileSync(filesToProcess[i],'utf8').length;
} catch (e) {
console.log("There is an error whilst processing file: " + filesToProcess[i] + ". Hence, it's skipped. Error: " + e.message);
}
}
console.log("Total Letter Count: " + totalLetterCountImperative);
以下尝试有效,但看起来笨重且尴尬。此外,它并非对所有错误都是通用的:
const filesToProcess = ['file1.txt','file2.txt','non_existent_file.txt'];
const totalLetterCount = filesToProcess
.filter(f => fs.existsSync(f))
.map(f => fs.readFileSync(f,'utf8').length)
.reduce((a,b) => a+b);
filesToProcess
.filter(f => !fs.existsSync(f))
.map(f => console.error("There is an error whilst processing file: " + f +". Hence it's skipped. Error: File doesn't exist"));
console.log("Total Letter Count: " + totalLetterCount);
我读到了Either 的用法。如果这确实是惯用的方式,有人可以举个例子并建议使用一个好的 JavaScript 库吗?
谢谢。
【问题讨论】:
-
如果您想在出错时放弃管道,请使用
Eithermonad,但如果您只想记录错误但继续管道,请使用Writermonad。快速谷歌搜索找到了两者的 JS 库。 -
也许你不需要一个 monad。查看validation 应用程序。它的行为类似于
Either,但没有短路,并且它有一个旨在处理错误的词汇表。
标签: javascript functional-programming idioms