簡體   English   中英

函數編程中的nodejs createReadStream

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM