使用 fp-ts 时如何使用 TypeScript 序列化任务执行?

How to serialize task executions with TypeScript when using fp-ts?

提问人:Adam Arold 提问时间:9/12/2023 更新时间:9/13/2023 访问量:33

问:

我有一些代码可以将数组中的值转换为异步调用:

const createDiscordChannels = flow(
    A.map((channel: CreateChannelDto) => ({
        ...channel,
        provider,
        externalServerId: providerId,
    })),
    //* 📘 We need to check all the channels before we do anything
    //* because otherwise we can end up in an inconsistent state
    A.map(agentDispatcher.isChannelValid), // 👈 returns TaskEither
    A.map(TE.flatMap(agentDispatcher.ensureChannelExists)), // 👈 creates race condition
    A.map(RTE.fromTaskEither),
    RTE.sequenceArray
);

我的问题是这将创建一堆并行执行的 s,从而创建竞争条件。A.map(TE.flatMap(agentDispatcher.ensureChannelExists))TaskEither

有没有办法创建并立即等待按顺序而不是并行执行它们?TaskEither

TypeScript 并行处理 FP-TS

评论


答:

1赞 Souperman 9/13/2023 #1

简短的回答是使用 sequenceSeqArray,它将按顺序运行每个任务并将结果收集到单个 .您当前使用的 which 是相似的,但具有您正在描述的行为,其中每个 promise 都是并行启动的。ReaderTaskEitherRTE.sequenceArray