gpt4 book ai didi

javascript - 函数式编程中的nodejs createReadStream

转载 作者:行者123 更新时间:2023-12-03 00:53:46 28 4
gpt4 key购买 nike

我想收到您对使用 fp-tsTaskEither 使用的反馈或其他用于学习目的的函数式编程库:

  • 我在处理nodejs流时使用Promise,以这种方式使用Promise是一个好的解决方案吗?最直接的替代方案是什么?
  • 我正在使用 .run().then(...).fold 您知道使用我的函数的更简洁的方法吗?
  • 是否可以在没有 Promise 的情况下使用 Either 重写相同的代码?您能给我提供一个 sample 吗?
<小时/>
export const md5 = (path: string): TaskEither<string, string> => {
const mkHash = (p: string) =>
new Promise<string>((resolve, reject) => {
const hash = createHash("md5");
const rs = createReadStream(p);
rs.on("error", (error: Error) => reject(error));
rs.on("data", chunk => hash.update(chunk));
rs.on("end", () => {
return resolve(hash.digest("hex"));
});
});
return tryCatch<string, string>(
() => mkHash(path).then(x => x),
message => `cannot create md5 hash: ${message}`
);
};
<小时/>
it("should return right and create md5 hash for a file", () => {
md5(fileName)
.run()
.then(e =>
e.fold(console.log, r => {
expect(r).toBe("SD8ddDad0756a93ded72b823b19dd877");
})
);
});

it("should return left with an error message", () => {
md5(BAD_PATH)
.run()
.then(e =>
e.fold(error => expect(error).toContain("ENOENT"), () => ({}))
);
});

最佳答案

我会使用Fluture为了这个任务。它是 Promise 库的一个单子(monad)惰性评估替代方案,可以包装或生成 Promise,但它可以单独工作:

export const md5 = path =>
Future ((reject, resolve) => {
const hash = createHash ("md5")
const rs = createReadStream (p)

rs.on("error", reject);
rs.on("data", chunk => hash.update (chunk));
rs.on("end", () => {
resolve (hash.digest ("hex"));
})
})
}

const eventualMd5 = md5('[path]')

Future.fork (console.error) (console.log) (eventualMd5)

基本上,您可以充分利用可用于异步流程的Either,以及许多相关工具来 fork 代码并处理错误和成功场景。

关于javascript - 函数式编程中的nodejs createReadStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52936627/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com