【问题标题】:Best practice for passing through generator function in JSJS中通过生成器函数的最佳实践
【发布时间】:2020-04-07 15:46:37
【问题描述】:

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

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

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

    // ...
}

扩展不是一种选择,因为这是我需要的设计模式。

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

  1. 除了yield,我如何传递return
  2. 有没有更好更干净的方法来实现它?

【问题讨论】:

  • #service 看起来不像 ES6

标签: javascript ecmascript-6 generator yield


【解决方案1】:
  1. 除了yield,我如何传递return
* generate() {
    return yield* this.service.generate();
}
  1. 有没有更好更干净的方法来实现它?
generate() {
    return this.service.generate();
}
    #service;
this.#service = …
return this.#service.generate();

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2019-02-19
    • 2020-07-29
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多