# gensync 中文文档

规范地址：https://npmcn.com/package/gensync/

版本：1\.0\.0-beta\.2
npm 元数据更新时间：2022-06-18T07:31:53.380Z
中文译文更新时间：2026-11-04T22:46:29.661Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/gensync
原文对照：https://npmcn.com/package/gensync/?lang=original
项目主页：https://github.com/loganfsmyth/gensync
源码仓库：https://github.com/loganfsmyth/gensync

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：28.9 kB，7 个文件
- 模块格式：CommonJS
- TypeScript 类型：未声明
- Node.js 要求：\>=6\.9\.0
- 运行依赖：0 个
- 首次发布：2015-11-23T04:44:36.845Z
- 最新版本发布：2020-10-27T20:43:40.443Z
- 近 30 天下载量：678978866（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：4（近 12 个月 0 个）

## 中文简介

允许用户使用生成器来编写同步或异步的常用函数。

## 安装

```sh
npm install gensync
```

也可以使用：`pnpm add gensync`、`yarn add gensync`、`bun add gensync`

## README

# gensync

该模块允许开发人员编写可以共享的公共代码 实现细节，隐藏底层请求是否发生 同步或异步。这与当前的许多Node形成了对比 显式实现相同API两次的API，一次是调用 同步函数，和一次异步函数。

举例来说 `fs.readFile` 和 `fs.readFileSync`，如果你正在编写API 加载文件，然后对数据执行同步操作 维护两个并行函数可能会令人沮丧。

## 例子

```js
const fs = require("fs");
const gensync = require("gensync");

const readFile = gensync({
  sync: fs.readFileSync,
  errback: fs.readFile,
});

const myOperation = gensync(function* (filename) {
  const code = yield* readFile(filename, "utf8");

  return "// some custom prefix\n" + code;
});

// Load and add the prefix synchronously:
const result = myOperation.sync("./some-file.js");

// Load and add the prefix asynchronously with promises:
myOperation.async("./some-file.js").then(result => {

});

// Load and add the prefix asynchronously with promises:
myOperation.errback("./some-file.js", (err, result) => {

});
```

这甚至可以通过以下方式公开为您的官方API

```js
// Using the common 'Sync' suffix for sync functions, and 'Async' suffix for
// promise-returning versions.
exports.myOperationSync = myOperation.sync;
exports.myOperationAsync = myOperation.async;
exports.myOperation = myOperation.errback;
```

或可能将其中一个异步版本作为默认值公开，使用 `.sync` 属性以公开同步版本。

```js
module.exports = myOperation.errback;
module.exports.sync = myOperation.sync;
```

## API

### gensync (generatorFnOrOptions)

返回一个可以在另一个函数中“await”执行的函数 `gensync` 发电机 函数，或通过

-   `.sync(...args)` -返回计算值，或抛出。
-   `.async(...args)` -返回计算值的承诺。
-   `.errback(...args, (err, result) => {})` -使用计算值或错误调用回调函数。

#### 经过一个发电机

封装生成器以填充 `.sync`/`.async`/`.errback` 以上的帮手 允许对生成器的最终值进行评估。

##### 例子

```js
const readFile = function* () {
  return 42;
};

const readFileAndMore = gensync(function* (){
  const val = yield* readFile();
  return 42 + val;
});

// In general cases
const code = readFileAndMore.sync("./file.js", "utf8");
readFileAndMore.async("./file.js", "utf8").then(code => {})
readFileAndMore.errback("./file.js", "utf8", (err, code) => {});

// In a generator being called indirectly with .sync/.async/.errback
const code = yield* readFileAndMore("./file.js", "utf8");
```

#### 传递一个选项对象

-   `opts.sync`
    
    例子: `(...args) => 4`
    
    一个将被调用的函数 `.sync()` 被调用 `gensync()` 结果，或者将结果传递给 `yield*` 在另一个发电机中 正在同步运行。
    
    也呼吁 `.async()` 如果没有提供异步处理程序，则调用。
    
-   `opts.async`
    
    例子: `async (...args) => 4`
    
    一个将被调用的函数 `.async()` 或 `.errback()` 是被调用的 这个 `gensync()` 结果，或者将结果传递给 `yield*` 在另一个 正在异步运行的生成器。
    
-   `opts.errback`
    
    例子: `(...args, cb) => cb(null, 4)`
    
    一个将被调用的函数 `.async()` 或 `.errback()` 是被调用的 这个 `gensync()` 结果，或者将结果传递给 `yield*` 在另一个 正在异步运行的生成器。
    
    这个选项允许更简单地兼容许多现有的Node api， 也避免了引入额外的偶数循环 访问结果值。
    
-   `opts.name`
    
    例子: `"readFile"`
    
    应用于返回函数的字符串名称。如果没有提供值， 的名字 `errback`/`async`/`sync` 函数将与任何一起使用 `Sync` 或 `Async` 去掉后缀。如果回调简单地命名 对于ES6推断（与options属性同名），该名称将被忽略。
    
-   `opts.arity`
    
    例子: `4`
    
    要在返回函数上设置的长度的数字。如果没有值 ，长度将从 `sync` 函数的 `length` 价值。
    

##### 例子

```js
const readFile = gensync({
  sync: fs.readFileSync,
  errback: fs.readFile,
});

const code = readFile.sync("./file.js", "utf8");
readFile.async("./file.js", "utf8").then(code => {})
readFile.errback("./file.js", "utf8", (err, code) => {});
```

### gensync.all (iterable)

`Promise.all`类似于与生成器对象的可迭代对象一起工作的组合子 可以传递给 `yield*` 在基因同步发生器里。

#### 例子

```js
const loadFiles = gensync(function* () {
  return yield* gensync.all([
    readFile("./one.js"),
    readFile("./two.js"),
    readFile("./three.js"),
  ]);
});
```

### gensync.race (iterable)

`Promise.race`类似于与生成器对象的可迭代对象一起工作的组合子 可以传递给 `yield*` 在基因同步发生器里。

#### 例子

```js
const loadFiles = gensync(function* () {
  return yield* gensync.race([
    readFile("./one.js"),
    readFile("./two.js"),
    readFile("./three.js"),
  ]);
});
```

## 常见问题

### gensync 是什么？

允许用户使用生成器来编写同步或异步的常用函数。

### 如何安装 gensync？

在项目目录运行 npm install gensync，或使用 pnpm add / yarn add / bun add。

### gensync 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/gensync 是否存在。

### gensync 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### gensync 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=6\.9\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### gensync 可以商用吗？

gensync 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### gensync 的下载量有多少？

根据 npm 官方下载统计，gensync 在 2026/10/07 – 2026/11/05 这 30 天内被下载 678,978,866 次，日均约 22,632,629 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### gensync 还在维护吗？

最新版本 1\.0\.0-beta\.2 发布于 2020/10/28（6 年前）；至今共发布 4 个版本，其中过去 12 个月发布了 0 个；首次发布于 2015/11/23。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

