获取迭代器函数最终值的惯用方式是什么?

问题描述

我有一个非常复杂的函数,它描述了一些迭代过程。看起来像这样(我有很多与问题无关的代码):

function* functionName(
    config: Config,poolSize: number
): Generator<[State,Step],boolean,void> {
    /* ... */

    for (const step of someOtherProcess()) {
        /* ... */

        yield [state,step]

        switch (stateType) {
            case StateType.Start:
                if (/* ... */) {
                    return false
                } else {
                    return true
                }

            case StateType.Invalid:
                return false
        }
    }

    return false
}

它执行三件事:(1)模拟某个过程,(2)提供该过程的每个步骤的信息(如您在yield行中所见),以及(3)提供最终结果该过程完成时。显然,(3)和(2)是(1)的直接逻辑结果,这就是为什么我在一个功能中同时执行两个任务。

但是,虽然该函数的某些用户关心每个步骤(2),但其他一些用户仅关心最终结果(3)。

现在,我用这个:

const generator = functionName(config,poolSize)
let result
while (!(result = generator.next()).done) {}
return result.value as boolean

还有其他惯用且简单的方法来达到相同的结果吗?

解决方法

您不仅可以添加选项吗?

function* functionName(
    config: Config,poolSize: number,yieldSteps = true
): Generator<[State,Step],boolean,void> {
    /* ... */

    for (const step of someOtherProcess()) {
        /* ... */

        if (yieldSteps) { yield [state,step] }

        switch (stateType) {
            case StateType.Start:
                if (/* ... */) {
                    return false
                } else {
                    return true
                }

            case StateType.Invalid:
                return false
        }
    }

    return false
}