首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fp-ts和mongo db的异步迭代器

使用fp-ts和mongo db的异步迭代器
EN

Stack Overflow用户
提问于 2021-08-11 12:14:00
回答 1查看 117关注 0票数 2

在节点中使用mongodb时,我们可以使用异步迭代器。基本示例:

代码语言:javascript
复制
const documents: Record<string, any>[] = [];
let cursor = db.collection('randomcollection').find();

for await (let doc of cursor) {
  documents.push(document);
}

如何使用fp-ts将异步迭代器转换为函数式编程?可以用fp-ts来表达上面的for循环吗?我已经搜索过了,但是没有找到关于异步迭代器的文档。

代码语言:javascript
复制
  const whereIamRightNow = pipe(
    TE.bindTo('db')(createMongoClientWithEncryption),
    TE.bind('cursor', ({ db }) => TE.of(getQueryCursor(dateRange)(db.client))),

    // how to async iterate over query cursor and call a processing function for each record?
  );
EN

回答 1

Stack Overflow用户

发布于 2021-10-09 09:33:32

我的建议是如何使用fp-ts编写此代码,这取决于确切的所需流程,但如果您想收集Promises集合的所有期待值,我认为您可以这样做:

代码语言:javascript
复制
import { pipe } from 'fp-ts/lib/function';
// Task is the `fp-ts` way of tracking asynchronous work
import * as T from 'fp-ts/lib/Task';

const documents: T.Task<readonly any[]> = pipe(
  // For simplicity let's assume the db's find method returns a Task[]
  db.collection('randomcollection').find(),
  T.sequenceArray
);

sequenceArray类似于在将数组中的所有项添加到documents之前使用Promise.all对它们执行await操作。

我不相信在vanilla fp-ts中有更好的方法。有评论指出,其他库可能对迭代器有更好的支持,但我想介绍Task,它是用于异步工作的fp-ts monad。一旦定义了整个Task,就像调用函数一样调用它,它会将值转换为Promise

代码语言:javascript
复制
const docs = await documents();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68741811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档