Categories
Tags
Ai 生成 API学习 API简化 api请求 API调用 best-practices Blogging Caching catchTag catchTags class CLI Config context Context Context.Tag CSS Customization Demo development DocC Docker dual API Effect effect Effect.Service Effect.succeed Example extension ffmpeg filterOrFail flatMap Fuwari gen generator grep hooks HTML HTTP响应 IDE自动补全 iOS javascript JavaScript Javascript Layer.effect Layer.provide Layers Linux Markdown Mock n8n Next.js ParseError pipe pokemon PostCSS process.env progress Promise promise provideService PWA react React React Hook Form React Query React Router react-native Scheduler Schema Schema.Class security Service Worker Services SSR state-management suspense Tagged Errors TaggedError TanStack Query TanStack Start tips tryPromise tsconfig TypeScript typescript Video VS Code vscode Web API Web Development yield yt-dlp Zod 不透明类型 二叉树 代码组织 任务调度 优先级 使用服务 依赖注入 依赖管理 值语义 入门教程 最佳实践 最小堆 函数式编程 函数组合 前端 前端开发 副作用 副作用控制 可视化 可组合性 可维护性 可访问性 命令行 响应过滤 多个错误 实现 实践指南 层 层依赖 层组合 工具链 并发控制 应用架构 延迟执行 开发技巧 开发教程 开源 异步处理 异步操作 异步编程 性能优化 手写系列 排序 接口设计 插件开发 数据结构 数据获取 数据解码 数据验证 无限滚动 日历 日志分析 服务 服务依赖 服务定义 服务实现 服务提供 测试 源码分析 状态管理 环境变量 生成器 离线支持 程序分离 算法 类型安全 类型定义 类型推断 类型系统 类定义 线性代码 组合 翻译 自动化 自定义错误 表单验证 记忆化 设计模式 语义化 运维 运行时验证 部分应用 配置 配置变量 配置服务 配置管理 重构 错误处理 错误定义 错误恢复 项目设置
503 words
3 minutes
Effect 类型安全错误处理:3. flatMap:组合 Effect
Effect 是程序的完整描述。我们可以将 Effect 相互组合,构建描述更复杂程序的其他 Effect。
在这个例子中,我们有 2 个 Effect:fetchRequest 和 jsonResponse:
fetchRequest返回一个包含Response的 Effect- 我们想要从第一个 Effect 中提取
Response并将其提供给jsonResponse
问题是我们将 Response 包装在 Effect 内部(Effect<Response>)。我们不能再直接”提取” Response 了:
const fetchRequest = Effect.promise(() =>
fetch("https://pokeapi.co/api/v2/pokemon/garchomp/")
);
const response: Response = /// 无法直接访问 `Response` 😬Effect 是计算。它们不持有
Response。无法从 Effect 中获取
Response,因为Response(还)不存在。执行 Effect 将产生一个
Response。
相反,Effect 提供了函数来描述基于前一个(或多个)Effect 的值要执行的下一步操作。
flatMap:获取值并返回 Effect
Effect.flatMap 允许访问 Effect 的结果并链接另一个 Effect:
- 第一个参数:我们想要从中提取值的
Effect - 第二个参数:提供对第一个
Effect参数访问权限并返回另一个Effect的函数
const fetchRequest = Effect.promise(() =>
fetch("https://pokeapi.co/api/v2/pokemon/garchomp/")
);
const main = Effect.flatMap(
fetchRequest, // 👈 从 `fetchRequest` 中提取值
(response) => // 👈 访问 `Response` 并返回另一个 `Effect`
);使用 Effect.flatMap,我们可以链接 jsonResponse,因为我们可以访问 response:
/// 👇 `Effect<Response>`
const fetchRequest = Effect.promise(() =>
fetch("https://pokeapi.co/api/v2/pokemon/garchomp/")
);
/// 👇 `Effect<unknown>`(`jsonResponse` 的返回类型)
const main = Effect.flatMap(
fetchRequest,
(response) => jsonResponse(response)
);这可能看起来很奇怪。不再是一行接一行的线性命令式代码,而是使用以其他函数作为输入并返回函数的函数 🙌
现在请耐心等待,Effect 提供了一些编写更好看代码的方法,我们稍后会介绍。
然后我们可以使用 runPromise 运行最终程序:
runPromise是runSync的等价物,但用于异步程序
const fetchRequest = Effect.promise(() =>
fetch("https://pokeapi.co/api/v2/pokemon/garchomp/")
);
const jsonResponse = (response: Response) =>
Effect.promise(() => response.json());
const main = Effect.flatMap(
fetchRequest,
(response) => jsonResponse(response)
);
Effect.runPromise(main);我们甚至可以将代码简化为:
const fetchRequest = Effect.promise(() =>
fetch("https://pokeapi.co/api/v2/pokemon/garchomp/")
);
const jsonResponse = (response: Response) =>
Effect.promise(() => response.json());
const main = Effect.flatMap(
fetchRequest,
jsonResponse
);
Effect.runPromise(main);Effect 类型安全错误处理:3. flatMap:组合 Effect
https://0bipinnata0.my/posts/course/effect-beginners-complete-getting-started/type-safe-error-handling-with-effect/flatmap-composing-effects/