通过JS中的生成器函数的最佳做法

问题描述 投票:0回答:1

我试图找出将生成器函数(包括yield)传递给另一个函数的最佳实践。

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

假设我具有类ServiceAServiceB,它们具有相同的方法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;
    }

    // ...
}

现在,我有一个包装器类ServiceName,它使用类ServiceAServiceB,而且还从这些类中传递了generate方法:

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中的ServiceManager方法的两个问题:

  1. return外,我还如何通过yield
  2. 是否有更好,更干净的方法来实施它?
javascript ecmascript-6 generator yield
1个回答
1
投票
  1. return外,我还如何通过yield
* generate() {
    return yield* this.service.generate();
}
  1. 是否有更好,更干净的方法来实施它?
generate() {
    return this.service.generate();
}
    #service;
this.#service = …
return this.#service.generate();
© www.soinside.com 2019 - 2024. All rights reserved.