Javascript 在JS中传递生成器函数的最佳实践

Javascript 在JS中传递生成器函数的最佳实践,javascript,ecmascript-6,generator,yield,Javascript,Ecmascript 6,Generator,Yield,我试图找出将生成器(包括产量)函数按原样传递给另一个函数的最佳实践 换句话说,我正在寻找一种更好的方法来实现以下目标 假设我有类ServiceA和ServiceB,它们拥有相同的方法generate,生成一些序列: class ServiceA extends ServiceBase { // ... * generate() { const length = Math.round(Math.rand() * 100); for (let i=0

我试图找出将生成器(包括产量)函数按原样传递给另一个函数的最佳实践

换句话说,我正在寻找一种更好的方法来实现以下目标

假设我有类
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;
    }

    // ...
}
扩展不是一个选项,因为这是我需要的设计模式

关于类
ServiceManager
中的
generate
方法的两个问题:

  • 除了
    收益
    之外,我如何传递
    返回
  • 有没有更好、更干净的方法来实现它
  • 除了
    收益
    之外,我如何传递
    返回
  • 有没有更好、更干净的方法来实现它
  • #服务
    看起来不像ES6
    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;
        }
    
        // ...
    }
    
    * generate() {
        return yield* this.service.generate();
    }
    
    generate() {
        return this.service.generate();
    }
    
        #service;
    
    this.#service = …
    
    return this.#service.generate();