首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化fp-ts函数

简化fp-ts函数
EN

Stack Overflow用户
提问于 2022-06-01 06:33:30
回答 1查看 80关注 0票数 1

我的职能是:

代码语言:javascript
复制
export const getProducts = makeRequest(
  /** Your query */
  `asasd*[_type == "product"] {
      _id,
      title
    }`,
  /** Optionally transform the response */
  (i) => i,
  /** Validate exact type */
  D.array(Product)
);

类型如下:

代码语言:javascript
复制
const getProducts: TaskEither<Error, {
    _id: string;
    title: string;
}[]>

这在Next.js API路由中使用,如下所示:

代码语言:javascript
复制
export default async (
  _: NextApiRequest,
  res: NextApiResponse<Array<Product>>
) => {
  const request = await getProducts();
  return pipe(
    request,
    E.fold((v) => res.status(400).end(v.message), res.status(200).json)
  );
};

它可以工作,但是如何简化最后一个函数呢?我希望await getProducts()能在管道中内联,所以我不需要预先执行request任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-01 06:59:17

您可以从map模块中使用Task

代码语言:javascript
复制
import * as T from 'fp-ts/Task'

export default async (
  _: NextApiRequest,
  res: NextApiResponse<Array<Product>>;
) => pipe(
  request,
  T.map(E.fold((v) => res.status(400).end(v.message), res.status(200).json))
)();

pipe(request, T.map(...)))返回一个Task,所以必须在结束时调用它,以便执行它。

如果您真的想在最后避免使用(),您可以这样做:

代码语言:javascript
复制
const runTask = async <A>(task: T.Task<A>): Promise<A> => task();

export default async (
  _: NextApiRequest,
  res: NextApiResponse<Array<Product>>;
) => pipe(
  request,
  T.map(E.fold((v) => res.status(400).end(v.message), res.status(200).json)),
  runTask
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72457369

复制
相关文章

相似问题

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