首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fp-ts/typescript避免嵌套管道

fp-ts/typescript避免嵌套管道
EN

Stack Overflow用户
提问于 2020-06-13 07:49:07
回答 1查看 693关注 0票数 2

在typescript中使用fp-ts时,如何避免嵌套管道?做符号吗?下面是我想要避免的嵌套管道示例

代码语言:javascript
复制
  pipe(
  userId,
  O.fold(
    () => setUser('No user found'),
    (uId: string) => {
      fetchUser(uId).then((response: Either<NonEmptyArray<string>, User>) => {
        pipe(
          response,
          E.fold(
            () => setUser('Unable to fetch user'),
            (user: User) => setUser(JSON.stringify(user, null, 2))
          )
        );
      });
    }
  )
);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-13 17:59:24

一种方法是尽可能地延迟fold,以避免不必要的嵌套。

代数效果可以在不需要知道值是否存在或操作失败的情况下合成。

例如,如果没有找到用户,使用chain转换的TaskEither将保留第一个错误。否则,它将包含成功案例中的fetchUser错误或User数据。

Working example

代码语言:javascript
复制
import { pipeable as P, option as O, taskEither as TE, nonEmptyArray as NA } from "fp-ts";

type User = { name: string };

// global state (side effect)
let user: string | undefined = undefined;
const setUser = (usr: string) => (user = usr);

// given input
const userId: O.Option<string> = O.some("Arun");

const fetchUser: (uid: string) => TE.TaskEither<NA.NonEmptyArray<string>, User> = uid =>
  TE.taskEither.of({ name: "Arun" });
  // An error case would be: TE.left(NA.of("Unable to fetch user"))  

const res = P.pipe(
  userId,
  TE.fromOption(() => NA.of("No user found")),
  TE.chain(fetchUser),
  TE.map(user => JSON.stringify(user, null, 2)),
  TE.fold( // we fold at the very end before applying the effect
    err => TE.taskEither.fromIO(() => { setUser(err[0]); }),
    user => TE.taskEither.fromIO(() => { setUser(JSON.stringify(user, null, 2)); })
  ),
  TE.chain(() => TE.taskEither.fromIO(() => { console.log(user); }))
);

// run the effect
res();

PS:我在这里假设,您的fetchUser是一个异步操作,它创建TaskEither。如果需要,您可以将其切换回Either

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62353956

复制
相关文章

相似问题

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