{
  "schemaVersion": 1,
  "citationId": "ecn:v4/getting-started/using-generators@16b1646#理解-effectgen",
  "citeUrl": "/cite/cb6a4c5694ac1fc0.json",
  "digest": "cb6a4c5694ac1fc0",
  "slug": "v4/getting-started/using-generators",
  "version": "v4",
  "title": "使用 Generator",
  "anchor": "理解-effectgen",
  "headingPath": [
    "理解 Effect.gen"
  ],
  "pageUrl": "/docs/v4/getting-started/using-generators/",
  "deepLink": "/docs/v4/getting-started/using-generators/#理解-effectgen",
  "officialUrl": "https://effect.website/docs/v4/getting-started/using-generators",
  "upstreamPath": "v4/getting-started/using-generators.mdx",
  "upstreamCommit": "16b1646850ded8b32b8b86bbdd941092d55d8f24",
  "upstreamRawUrl": "https://raw.githubusercontent.com/Effect-TS/website/16b1646850ded8b32b8b86bbdd941092d55d8f24/apps/web/src/content/docs/v4/getting-started/using-generators.mdx",
  "status": "published",
  "stale": false,
  "contentHash": "168b8c95f73d8835",
  "chunkText": "Effect.gen 工具借助 JavaScript 的 generator 函数，简化了编写带副作用代码的工作。这种方式能让你的代码在外观和行为上更接近传统的同步代码，从而提升可读性并改善错误管理。\n\n示例（执行带折扣的交易）\n\n让我们来看一个实用的程序，它执行一系列在应用逻辑中常见的转换操作：\n\n// Function to add a small service charge to a transaction amount\nconst addServiceCharge = (amount: number) => amount + 1\n\n// Function to apply a discount safely to a transaction amount\nconst applyDiscount = (\n total: number,\n discountRate: number,\n): Effect.Effect<number, Error> =>\n discountRate === 0\n ? Effect.fail(new Error(\"Discount rate cannot be zero\"))\n : Effect.succeed(total - (total discountRate) / 100)\n\n// Simulated asynchronous task to fetch …\n\n使用 Effect.gen 时需要遵循的关键步骤：\n把逻辑包裹在 Effect.gen 中\n使用 yield 处理 effect\n返回最终结果\n\n如果你在 generator 中通过 yield 处理的任何一个 effect 失败了，那么 generator 会停止执行，并以该失败退出。\n\n \n\n 只有在 tsconfig.json 文件中使用 downlevelIteration 标志，或者把\n\n target 设为 \"es2015\" 或更高版本时，才能使用 generator API。",
  "generatedAt": "2026-09-18T14:48:33.525Z"
}
