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"),
]);
});