Получить следующее значение в последовательности без использования функции генератора при нажатии кнопки с javascript

Я хочу получить следующее значение (уникальное) в пределах 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.info(gen.next());
        // console.info(gen.next());
        // console.info(gen.next());
        // console.info(gen.next());
    });
</script>

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
270
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

On click of a button, I was only able to receive the first value in the sequence

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

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

Боже мой! Большое спасибо

yemiwebby 04.01.2019 11:08

Проблема заключалась в следующем: вы переопределяли генератор при каждом щелчке #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.info(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>

Большое спасибо. Это очень полезно

yemiwebby 04.01.2019 11:30

Другие вопросы по теме