6

我的目标是从 API 请求事务并将它们存储到数据库中。响应是分页的,我想读取每一页并分批存储事务。

因此,对于一个请求/响应周期,我希望在获取下一批之前处理结果并将其存储到数据库中。

我如何在 fp-ts 中以惯用的方式做到这一点?我注入了实际的 HTTP fetch 调用(url:string, init:RequestInit) => TE.TaskEither<Error, Response>,以使其保持可测试性。

到目前为止,我已经测试了 RxJS 和 fp-ts,即使我让它工作起来也有点复杂。

确实尝试了递归函数和生成器,但我没有成功地让它被懒惰地评估。

是否有任何现有的 fp-ts 示例显示每个元素都依赖于前一个元素的延迟评估流?

4

1 回答 1

0

您可以使用StateReaderTaskEither
假设您要读取文件列表,并且下一个文件名存储在当前文件中。

import * as TE from 'fp-ts/TaskEither'
import * as RA from 'fp-ts/ReadonlyArray'
import { pipe } from 'fp-ts/function'

const files = {
  file1: 'file2',
  file2: 'file3',
  file3: 'file5',
  file4: 'file6',
  file5: 'file4',
}
const getFile = (filename: string, encoding: string) =>
  Promise.resolve(files[filename])

const fileSRTE: SRTE.StateReaderTaskEither<
  string,
  string,
  unknown,
  string
> = (filename: string) => (encoding: string) =>
  pipe(
    TE.tryCatch(
      () => getFile(filename, encoding),
      (err) => err
    ),
    TE.map((file) => [`file: ${file}`, file])
  )

const fileStream: TE.TaskEither<
  unknown,
  readonly string[]
> = pipe(
  RA.replicate(6, fileSRTE),
  SRTE.sequenceArray,
  SRTE.evaluate('file1')
)('utf-8')

fileStream().then(console.log)
//{ _tag: 'Right',right: [ 'file: file2','file: file3','file: file5','file: file4','file: file6','file: undefined' ] }

您可以在fp-ts Doc中更多地了解 State 和 Reader

于 2021-12-05T02:36:32.800 回答