【问题标题】:What's an idiomatic way to get the final value of the iterator function?获取迭代器函数最终值的惯用方法是什么?
【发布时间】:2020-12-23 18:04:20
【问题描述】:

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

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

有没有更惯用和简单的方法来达到同样的效果?

【问题讨论】:

    标签: javascript typescript iterator generator yield


    【解决方案1】:

    你不能只添加一个选项吗?

    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
    }
    

    【讨论】:

    • 谢谢!这解决了我在这种特殊情况下的问题,但我仍然很好奇,如果该生成器函数是第三方 API 的一部分呢?
    猜你喜欢
    • 2016-07-21
    • 2012-11-14
    • 2012-03-31
    • 2016-03-27
    • 2011-06-01
    • 2020-09-13
    • 2017-03-28
    • 2015-09-11
    相关资源
    最近更新 更多