![](/img/trans.png)
[英]NodeJS: Functional Programming - No access to prototype in handover function
[英]nodejs createReadStream in functional programming
我想通過fp-ts或其他用於學習目的的函數式編程庫獲得有關TaskEither
用法的反饋:
Promise
用流的NodeJS打交道時,是使用一個很好的解決方案Promise
以這種方式? 最直接的替代方法是什么? .run().then(...)
和.fold
,您知道使用我的函數的更簡潔的方法嗎? Promise
情況下使用Either
重寫相同的代碼嗎? 您能提供樣品嗎? 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庫的單反惰性評估,可以包裝或生成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
可用性,並Either
使用許多相關工具來分叉代碼並處理錯誤和成功情況。
部分答案:我只能在沒有Promise
情況下使用Either
重寫此函數。 我對替代解決方案仍然非常感興趣。
export const md5 = (path: string): Either<string, string> => {
const BUFFER_SIZE = 8192;
let fd;
try {
fd = openSync(path, "r");
const buffer = Buffer.alloc(BUFFER_SIZE);
const hash = createHash("md5");
let bytesRead;
do {
bytesRead = readSync(fd, buffer, 0, BUFFER_SIZE, 0);
hash.update(buffer.slice(0, bytesRead));
} while (bytesRead === BUFFER_SIZE);
return right(hash.digest("hex"));
} catch (error) {
return left(error.message);
} finally {
if (fd !== undefined) {
closeSync(fd);
}
}
};
it("should return right and create md5 hash for a file", () => {
const mk = md5(fileName);
assert.strictEqual(mk.isLeft(), false);
assert.strictEqual(mk.isRight(), true);
assert.strictEqual(mk.value, "SS8dd3ad07e6a93ded72b823b19dd877");
});
it("should return left return an error message", () => {
const mk = md5(BAD_PATH);
assert.strictEqual(mk.isLeft(), true);
assert.strictEqual(mk.isRight(), false);
assert.strictEqual(mk.value.includes("ENOENT"), true);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.