fp-ts如何将ReaderTaskEither数组的单层结构扁平化处理?
解决方案
实现思路
你当前持有的ContextResult<OwnedApp[]>[]是多个ReaderTaskEither实例的集合,每个实例内部包含一个OwnedApp数组,原生的flat/flatMap是JS数组的方法,只能操作外层的RTE实例数组,无法触达RTE内部包裹的数组内容,所以需要用fp-ts提供的函数式工具组合操作:
- 先把多个RTE实例组合成单个RTE实例,收集所有内部的数组结果,得到二维数组
OwnedApp[][] - 再把二维数组拍平为一维数组
完整代码实现
首先导入依赖:
import { pipe } from 'fp-ts/es6/function'; import * as RTE from 'fp-ts/es6/ReaderTaskEither'; import * as A from 'fp-ts/es6/Array';
基于你已有的getApps数组转换:
const flattenedGetApps: ContextResult<OwnedApp[]> = pipe( getApps, // 串行执行所有RTE,收集结果得到 ContextResult<OwnedApp[][]> RTE.sequenceArray, // 拍平内部二维数组 RTE.map(A.flatten) );
如果需要并行执行所有请求提升性能,可以直接在遍历marketplaceIds的阶段一步完成,不用先生成中间的getApps数组:
const getApps: ContextResult<OwnedApp[]> = pipe( marketplaceIds, // 并行遍历调用接口,直接得到 ContextResult<OwnedApp[][]> RTE.traverseArrayPar(marketplaceId => getAppsFromUser(userId, marketplaceId)), RTE.map(A.flatten) );
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

