- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 2 个嵌套请求的流程,其中可能有 3 个不同的结果:
两个请求都可能抛出错误,因为它实现了 TaskEither
const isAuth = ():TE.TaskEither<Error, E.Either<true, false>>
=> TE.tryCatch(() => Promise(...), E.toError)
const getProfile = ():TE.TaskEither<Error, Profile>
=> TE.tryCatch(() => Promise(...), E.toError)
第一个请求返回用户授权的 bool 状态。第二个请求加载用户配置文件如果用户被授权。
作为返回,我想得到下一个签名,Error 或 Either with Anonymous/Profile:
E.Either<Error, E.Either<false, Profile>>
我试过这样做:
pipe(
isAuth()
TE.chain(item => pipe(
TE.fromEither(item),
TE.mapLeft(() => Error('Anonimous')),
TE.chain(getProfile)
))
)
但作为返回,我得到 E.Either<Error, Profile>
,女巫不方便,因为我必须提取 Anonymous
手工状态来自 Error
.
如何解决这个问题?
最佳答案
不知道您是否过度简化了实际代码,但是 E.Either<true, false>
同构于 boolean
,所以让我们坚持使用更简单的东西。
declare const isAuth: () => TE.TaskEither<Error, boolean>;
declare const getProfile: () => TE.TaskEither<Error, Profile>;
然后根据是否授权添加条件分支并包装getProfile的结果:
pipe(
isAuth(),
TE.chain(authed => authed
? pipe(getProfile(), TE.map(E.right)) // wrap the returned value of `getProfile` in `Either` inside the `TaskEither`
: TE.right(E.left(false))
)
)
此表达式的类型为 TaskEither<Error, Either<false, Profile>>
.您可能需要添加一些类型注释才能正确进行类型检查,我自己还没有运行代码。
编辑:
您可能需要将 lambda 提取为命名函数以获得正确的类型,如下所示:
const tryGetProfile: (authed: boolean) => TE.TaskEither<Error, E.Either<false, Profile>> = authed
? pipe(getProfile(), TE.map(E.right))
: TE.right(E.left(false));
const result: TE.TaskEither<Error, E.Either<false, Profile>> = pipe(
isAuth(),
TE.chain(tryGetProfile)
);
关于javascript - 将 fp-ts TaskEither 与右侧的 Either 链接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61559808/
我必须并行进行一系列 IO 调用,如果成功则合并调用的内容。如果一个失败,其他人将按正常方式处理,但会显示错误消息。 我关于如何实现这一点的思考过程: Array> -> TE> -> TE ->
在我的 SPA 中,我有一个函数需要: 创建对象(例如用户的“标签”) 将其发布到我们的 API type UserId = string; type User = {id: UserId}; typ
我有 2 个嵌套请求的流程,其中可能有 3 个不同的结果: 其中一个请求返回错误 用户不是匿名的,返回个人资料 用户是匿名的,返回false 两个请求都可能抛出错误,因为它实现了 TaskEither
我有以下程序,当没有任何函数是异步的时,它可以正常工作。 interface Product { count: number pricePerItem: number } interface
我是 FP-TS 的新手,但仍然不太明白如何使用 TaskEither .我正在尝试异步读取文件,然后使用 yaml-parse-promise 解析结果字符串。 ==编辑== 我用文件的完整内容更新
我是一名优秀的程序员,十分优秀!