gensync

中文文档
1.0.0-beta.2发布于 2020/10/28MITCommonJS零依赖近 30 天下载 6.8亿

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

中文使用文档
文档目录5 节
  1. 例子
  2. API
  3. gensync (generatorFnOrOptions)
  4. gensync.all (iterable)
  5. gensync.race (iterable)

gensync

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

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

例子

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

// 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 属性以公开同步版本。

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 以上的帮手 允许对生成器的最终值进行评估。

例子
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 价值。

例子
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* 在基因同步发生器里。

例子

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

gensync.race (iterable)

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

例子

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

版本与发布记录

gensync 共发布 4 个版本,首次发布于 2015/11/23;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.0.0-beta.2latest2020/10/286 年前
1.0.0-beta.12019/09/297 年前
1.0.0-beta.02018/05/078 年前
0.1.02015/11/2310 年前

关于 gensync 的常见问题

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 和提交记录判断。