Получить следующее значение в последовательности, не используя функцию генератора по нажатию кнопки с JavaScript - PullRequest
0 голосов
/ 04 января 2019

То, чего я хочу достичь, - это иметь возможность получить следующее значение (уникальное) внутри factorialSequence по нажатию кнопки.

На данный момент я определил функцию factorialSeq () ифункция generator (), как показано ниже.Функция генератора принимает в качестве аргумента factorialSeq ().При нажатии кнопки я смог получить только первое значение в последовательности, но если я войду в консоль, все значения в последовательности будут возвращены в правильном порядке.

<button style="padding: 20px" id="nextBtn">Next</button>

<script>

    let nextBtn = document.getElementById('nextBtn');

    function generator(sequencer) {
        const seqArgs = [...arguments];
        seqArgs.shift();
        const seq = sequencer(...seqArgs);
        return {
            next() {
                return seq();
            }
        }
    }

    function factorialSeq() {
        let currentNumber = 1;
        let result;
        return function factorialReturn() {
            if (!result) {
                result = 1;
                return result;
            }

            result *= currentNumber;
            currentNumber += 1;
            return result;
        }
    }

    nextBtn.addEventListener('click', function () {
        var gen = generator(factorialSeq);

        console.log(gen.next());
        // console.log(gen.next());
        // console.log(gen.next());
        // console.log(gen.next());
    });
</script>

Я ожидаю, что результат будет отличаться каждый раз, когда я нажимаю кнопку (т.е. следующее значение в последовательности).Обратите внимание, что я не хочу использовать встроенную функцию генератора в javaScript.Спасибо

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Проблема заключалась в следующем: вы переопределяли генератор при каждом нажатии #next.Так что используйте это вместо:

let nextBtn = document.getElementById('nextBtn');
let resetBtn = document.getElementById('resetBtn');

    function generator(sequencer) {
        const seqArgs = [...arguments];
        seqArgs.shift();
        const seq = sequencer(...seqArgs);
        return {
            next:()=>{
                return seq();
            }
        }
    }

    function factorialSeq() {
        let currentNumber = 1;
        let result;
        return function factorialReturn() {
            if (!result) {
                result = 1;
                return result;
            }

            result *= currentNumber;
            currentNumber += 1;
            return result;
        }
    }
    
    var gen = generator(factorialSeq);
    nextBtn.addEventListener('click', function () {

        console.log(gen.next());
    });
    resetBtn.addEventListener('click', function () {
        gen = generator(factorialSeq);
    });
<button style="padding: 20px" id="nextBtn">Next</button>
<button style="padding: 20px" id="resetBtn">Reset</button>
0 голосов
/ 04 января 2019

При нажатии кнопки я смог получить только первое значение в последовательности

Это потому, что вы создаете новую последовательность при каждом нажатии кнопки и регистрируете только одинзначение (первое).Вы хотите сделать

var gen = generator(factorialSeq);
nextBtn.addEventListener('click', function () {
    console.log(gen.next());
});
...