在 JS 中传递生成器函数的最佳实践
Best practice for passing through generator function in JS
我正在尝试找出将生成器(包括 yield)函数按原样传递给另一个函数的最佳实践。
换句话说,我正在寻找一种更好的方法来实现以下目标。
假设我有 class ServiceA
和 ServiceB
,它们拥有相同的方法 generate
,生成一些序列:
class ServiceA extends ServiceBase {
// ...
* generate() {
const length = Math.round(Math.rand() * 100);
for (let i=0; i<length; i++)
yield i;
return -1;
}
// ...
}
class ServiceB extends ServiceBase {
// ...
* generate() {
const length = Math.round(Math.rand() * 100) + 100;
for (let i=100; i<length; i++)
yield i;
return 13;
}
// ...
}
现在,我有一个包装器 class ServiceName
,它使用 class ServiceA
或 ServiceB
,而且还通过 generate
方法来自这些 classes:
class ServiceManager {
#service;
constructor(serviceName) {
// The following require will return ServiceA or ServiceB instance
this.#service = require('./service/' + serviceName);
}
* generate() {
for ( let i of this.#service.generate() )
yield i;
}
// ...
}
扩展不是一个选项,因为这是我需要的设计模式。
关于class中generate
方法的两个问题 ServiceManager
:
- 除了
yield
之外,我如何通过 return
?
- 有没有更好更简洁的实现方式?
- How do I passthrough a
return
in addition to yield
?
* generate() {
return yield* this.service.generate();
}
- Is there a better and more clean way to implement it?
generate() {
return this.service.generate();
}
#service;
this.#service = …
return this.#service.generate();
我正在尝试找出将生成器(包括 yield)函数按原样传递给另一个函数的最佳实践。
换句话说,我正在寻找一种更好的方法来实现以下目标。
假设我有 class ServiceA
和 ServiceB
,它们拥有相同的方法 generate
,生成一些序列:
class ServiceA extends ServiceBase {
// ...
* generate() {
const length = Math.round(Math.rand() * 100);
for (let i=0; i<length; i++)
yield i;
return -1;
}
// ...
}
class ServiceB extends ServiceBase {
// ...
* generate() {
const length = Math.round(Math.rand() * 100) + 100;
for (let i=100; i<length; i++)
yield i;
return 13;
}
// ...
}
现在,我有一个包装器 class ServiceName
,它使用 class ServiceA
或 ServiceB
,而且还通过 generate
方法来自这些 classes:
class ServiceManager {
#service;
constructor(serviceName) {
// The following require will return ServiceA or ServiceB instance
this.#service = require('./service/' + serviceName);
}
* generate() {
for ( let i of this.#service.generate() )
yield i;
}
// ...
}
扩展不是一个选项,因为这是我需要的设计模式。
关于class中generate
方法的两个问题 ServiceManager
:
- 除了
yield
之外,我如何通过return
? - 有没有更好更简洁的实现方式?
- How do I passthrough a
return
in addition toyield
?
* generate() {
return yield* this.service.generate();
}
- Is there a better and more clean way to implement it?
generate() {
return this.service.generate();
}
#service;
this.#service = …
return this.#service.generate();