【问题标题】:How to get value of generator如何获得发电机的价值
【发布时间】:2020-09-25 14:00:08
【问题描述】:

scenario.ts

export interface Step {
    text: string;
    image: string;
    time: number
}

export interface IScenario {
    name: string;

    steps: Array<Step>;
}

餐厅.ts

import {IScenario, Step} from './interfaces/scenario'

export default class Restaurant implements IScenario {
    name: string = 'Приключение в ресторане';

    steps: Array<Step> = [
        {
            text: 'Вы пришли в ресторан',
            image: 'https://sun9-3.userapi.com/55H3n5pt-TvwwdQzmpBZ9mcHURCqf85x1mXvlw/oyI4OlFu3R0.jpg',
            time: 2000,
        },
        {
            text: 'Перед вами стоит стол',
            image: '',
            time: 5000,
        },
    ];

    private *enumerateSteps(steps: Array<Step>): IterableIterator<Step> {
        yield step;
    }   

    start(): void {
        for (const step of this.enumerateSteps(this.steps)) {
            setTimeout(() => {
                return console.log(step.text);
                step.next();
              }, step.time);
        }
    }
}

我想在 time 之后进行下一步,但出现错误:

类型“Step”上不存在属性“next”。

由于某种原因,我也有关于缺席step 的错误,但我不知道为什么。

【问题讨论】:

  • "由于某种原因缺少step 的错误" - 是的,您的enumerateSteps 方法中没有定义step 变量。你期望它是什么?请注意,您也没有在任何地方使用参数steps。 (但这似乎不是错字,因为它们有不同的类型)。
  • 我想在每种情况下都得到礼物step。我试图更新生成器const current = steps[0]; yield current;,但我仍然收到错误“属性'next'在类型'Step'上不存在:
  • 看起来您正在尝试异步迭代您的生成器。在这种情况下,正如@Bergi 所指出的,不需要一个,但该语言确实允许async interators
  • Bergi 的回答非常好,但您的代码存在另一个问题 - 如果您在生成器函数中仅 yield 一次(不在循环中),您只需迭代一次。换句话说,[...({ *[Symbol.iterator]() { yield 1 } })] 就是 [1]
  • 谢谢大家:)

标签: javascript typescript generator


【解决方案1】:

您根本不应该在这里使用生成器。你想要的可以通过基于回调的方法来完成

start(callback?: () => void): void {
    this.steps.reduceRight((next, step) => () => {
        console.log(step.text);
        setTimeout(next, step.time);
    }, () => {
        console.log('All steps done');
        callback?.();
    })();
}

或与承诺和async/await:

async start(): Promise<void> {
    for (const step of this.steps) {
        console.log(step.text);
        await new Promise(resolve => setTimeout(resolve, step.time));
    }
    console.log('All steps done');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多