【问题标题】:fp-ts/typescript avoid nested pipesfp-ts/typescript 避免嵌套管道
【发布时间】:2020-06-12 23:49:07
【问题描述】:

在打字稿中使用 fp-ts 时如何避免嵌套管道?做记号?这是我想避免的嵌套管道示例

  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))
          )
        );
      });
    }
  )
);

【问题讨论】:

    标签: typescript fp-ts


    【解决方案1】:

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

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

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

    Working example

    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

    【讨论】:

    • chain 从管道中的前一个序列中获取计算值。对吗?
    • 是的,在上述情况下,TE.chain(fetchUser) 解析为一个函数,该函数从前一个管道段获取 TaskEither 并返回一个新的转换后的。
    猜你喜欢
    • 2019-07-06
    • 2021-08-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2011-02-16
    • 2016-11-19
    相关资源
    最近更新 更多