我的职能是:
export const getProducts = makeRequest(
/** Your query */
`asasd*[_type == "product"] {
_id,
title
}`,
/** Optionally transform the response */
(i) => i,
/** Validate exact type */
D.array(Product)
);类型如下:
const getProducts: TaskEither<Error, {
_id: string;
title: string;
}[]>这在Next.js API路由中使用,如下所示:
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任务。
发布于 2022-06-01 06:59:17
您可以从map模块中使用Task:
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,所以必须在结束时调用它,以便执行它。
如果您真的想在最后避免使用(),您可以这样做:
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
);https://stackoverflow.com/questions/72457369
复制相似问题