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 不透明类型 二叉树 代码组织 任务调度 优先级 使用服务 依赖注入 依赖管理 值语义 入门教程 最佳实践 最小堆 函数式编程 函数组合 前端 前端开发 副作用 副作用控制 可视化 可组合性 可维护性 可访问性 命令行 响应过滤 多个错误 实现 实践指南 层 层依赖 层组合 工具链 并发控制 应用架构 延迟执行 开发技巧 开发教程 开源 异步处理 异步操作 异步编程 性能优化 手写系列 排序 接口设计 插件开发 数据结构 数据获取 数据解码 数据验证 无限滚动 日历 日志分析 服务 服务依赖 服务定义 服务实现 服务提供 测试 源码分析 状态管理 环境变量 生成器 离线支持 程序分离 算法 类型安全 类型定义 类型推断 类型系统 类定义 线性代码 组合 翻译 自动化 自定义错误 表单验证 记忆化 设计模式 语义化 运维 运行时验证 部分应用 配置 配置变量 配置服务 配置管理 重构 错误处理 错误定义 错误恢复 项目设置
569 words
3 minutes
Effect 类型安全错误处理:2. 使用 Effect 进行 API 请求
让我们回到我们的 API 请求:
const main = async () => {
const response = await fetch("https://pokeapi.co/api/v2/pokemon/garchomp/");
const json = await response.json();
return json;
};
main().then(console.log);程序可以分为 2 个步骤:
- 执行
fetch请求 - 从响应中提取
json
const fetchRequest = () => fetch("https://pokeapi.co/api/v2/pokemon/garchomp/");
const jsonResponse = (response: Response) => response.json();
const main = async () => {
const response = await fetchRequest(); // 1️⃣
const json = await jsonResponse(response); // 2️⃣
return json;
};
main().then(console.log);就像在纯 TypeScript 中一样,在 Effect 中处理异步或同步函数时,我们需要使用不同的 API。
因此,首先要考虑的是这两个都是异步操作。对于这些操作,我们可以使用 Effect.promise。
Effect.promise 是任何异步操作的包装器。它返回一个包含调用异步函数结果的 Effect。
对于同步操作,
Effect.promise的等价物是Effect.sync。
从原生 TypeScript 转换到 Effect 只需要用 Effect.promise 包装你的异步操作:
import { Effect } from "effect";
// 👇 Promise<Response>
const fetchRequest =
() => fetch("https://pokeapi.co/api/v2/pokemon/garchomp/");
/// 👇 Effect<Response>
const fetchRequest = Effect.promise(
() => fetch("https://pokeapi.co/api/v2/pokemon/garchomp/")
);注意我们是如何精确地将 Promise 包装在 Effect.promise 内部的:
// 👇 Promise<Response>
const promiseRequest = () => fetch("https://pokeapi.co/api/v2/pokemon/garchomp/");
/// 👇 Effect<Response>
const fetchRequest = Effect.promise(promiseRequest);对于 response.json() 也是一样的:
import { Effect } from "effect";
/// 👇 Promise<unknown>
const jsonResponse = (response: Response) => response.json();
/// 👇 Effect<unknown>
const jsonResponse = (response: Response) => Effect.promise(
() => response.json()
); 我们从
Promise<Response>转换到了Effect<Response>:
Promise<Response>是急切的(异步操作立即执行)Effect<Response>是惰性的(需要显式执行,并且可以根据需要执行多次)
理解 Effect
到目前为止,我们所做的是用 Effect.promise 包装原生 API:
const fetchRequest = Effect.promise(
() => fetch("https://pokeapi.co/api/v2/pokemon/garchomp/")
);
const jsonResponse = (response: Response) => Effect.promise(
() => response.json()
);我们之前说过,Effect 是步骤的组合:
() => fetch("https://pokeapi.co/api/v2/pokemon/garchomp/")() => response.json()
根据我们使用的 API,我们告诉
Effect如何执行包装的函数。
Effect.promise的意思是:“异步地执行这个函数并返回其结果”
但这与我们之前所做的有什么不同呢?有什么好处?
在接下来的课程中,我们将探索如何将 effect 组合在一起。Effect 的这种组合特性允许定义错误处理、超时、过滤等功能。
使用 Effect 构建应用程序就是定义如何处理每个步骤,然后将它们组合在一起。
让我们接下来看看如何处理组合部分。
Effect 类型安全错误处理:2. 使用 Effect 进行 API 请求
https://0bipinnata0.my/posts/course/effect-beginners-complete-getting-started/type-safe-error-handling-with-effect/api-request-with-effect/