Глобальная переменная не обновляется

Я пытаюсь сделать генератор шуток Чака Норриса. У меня есть кнопка «Создать новую шутку», которая извлекает новую шутку из API, и у меня есть несколько кнопок с разными категориями шуток.

У меня есть глобальная переменная с именем categories, которую я пытаюсь изменить всякий раз, когда нажимается кнопка категории, но переменная продолжает иметь значение по умолчанию, когда извлекается новая шутка.

Что я делаю не так ?

Вот код:

document.addEventListener('DOMContentLoaded', start);
let category = 'animal';

async function fetchJoke(arrayz) {
    const response = await Promise.all(arrayz.map(url => fetch(url).then(response => response.json())));

    return response;
}

function start() {
    console.info('ready');
    fetchJoke(arrayz).then(render);
}

const arrayz = [`https://api.chucknorris.io/jokes/random?category=${category}`, 'https://api.chucknorris.io/jokes/categories'];


function render(data) {
    const main = document.querySelector('main');
    main.innerHTML = '';
    const clone = document.querySelector('.template').content.cloneNode(true);
    const joke = clone.querySelector('p');

    joke.textContent = data[0].value;

    clone.querySelector('.zbutton').addEventListener('click', () => {
        start();
    });
    createButton(data, clone);

    main.appendChild(clone);
}

function createButton(data, clone) {
    data[1].map(category => {
        const button = document.createElement('button');
        button.appendChild(document.createTextNode(category));
        button.addEventListener('click', (e) => {
            category = e.target.innerText;
            start();
        });

        clone.querySelector('.buttons').appendChild(button);
    })
}

Ссылка на jsfiddle

Https://jsfiddle.net/rcej8mkf/4/

Массивы ${category} in const будут оцениваться только один раз при загрузке страницы и никогда после изменения значения category.

charlietfl 20.12.2020 19:44
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
1
1
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

У вас есть две переменные с именем category.

  • Один создан с let в верхней части сценария, который вы только когда-либо читали.
  • Тот, который является именем первого и единственного аргумента, переданного функции, которую вы передаете map ближе к концу.

Вы перезаписываете последний, но больше никогда его не читаете.


Если вы хотите перезаписать глобальную в точке, не маскируйте ее другой переменной с тем же именем в более узкой области.

Конечно, это поднимает другую проблему, заключающуюся в том, что вы читаете глобальную переменную category только один раз, когда генерируете строку для назначения первому элементу в arrayz.

Вам нужно будет обновить его внутри start, чтобы он приносил пользу.

Понятно! Большое спасибо, теперь все работает отлично!

Why u do dis 20.12.2020 20:06

Arrayz вычисляется только один раз с начальным значением category. arrayz никогда не обновляется. Попробуйте поместить определение arrayz внутри вашей функции start.

Обновлено: и глобальная категория затеняется аргументом, как уже упоминалось.

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