Ответы пользователя по тегу JavaScript
  • Как остановить setInterval из функции?

    @twolegs
    setInterval возвращает id таймер, который вам следует сохранять в каком-нибудь поле/переменной. А далее просто clearInterval с сохранным id.
    Ответ написан
    Комментировать
  • Можно ли использовать eventlistener внутри observer'a?

    @twolegs
    > Скажется ли это на перфомансе?
    Скажется, ваши листенеры будут пересоздаваться каждый вызов колбэка, N раз в секунду.
    Ответ написан
    Комментировать
  • Как создать исключительно React или Vue приложение?

    @twolegs
    create react-app создает только фронтенд.
    Просто современные реалии фронтенда таковы, что для его сборки необходима node.js
    Все это необходимо для того, чтобы собрать в папку build бандл с вашим приложением.
    Ответ написан
    1 комментарий
  • Как пофиксить NODE_ICU_DATA?

    @twolegs
    Похоже, что вы на windows пытаетесь запустить скрипт, который к этому не приспособлен.
    NODE_ICU_DATA - это переменная окружения, попробуйте устанавливать ее через cross-env (https://www.npmjs.com/package/cross-env). Но не уверен. что pwd будет работать даже в этом случае.
    Ответ написан
    Комментировать
  • Не могу понять, почему валиться fetch при запросе?

    @twolegs
    const fullName = () => {
                let fullName = "";
    
                fullName += billing?.['first_name'] + " ";
                fullName += billing?.['last_name'];
    
                return fullName;
            };
            ...
            formData.append('name', fullName);


    Вот тут вы вместо строки в форму функцию добавляете, вероятно поэтому.

    formData.append('name', fullName());

    Но вообще не удивительно, что при таком стиле написания кода возникают баги. У вас глобальные переменные, перекрытие имен, мешанина с async и промисами. Попробуйте хотя бы банальный линтер добавить с базовыми правилами, будет уже чуть лучше.
    Ответ написан
    5 комментариев
  • Устроился работать Junior Frontend и попал в ад, что делать?

    @twolegs
    Сложно сказать, насколько это вообще ад.
    Да, возможно стек старый, но с архитектурной точки зрения приложение может быть сделано хорошо.
    Ваша проблема сейчас в том, что вы в какой-то мере начали понимать типичный реакт стек, но не видели мира за его пределами.
    Приложения на реакте, как правило, это пример плохой архитектуры. В реакте есть какие-то общие практики, но сейчас вы не можете сказать хороши они или нет, потому что вы не работали с другими.
    Мой совет - продолжить работать и попытаться понять глобально как работает продукт, какие архитектурные паттерны и решения в нем используются.
    Когда вы пройдете стадию отрицания и разберетесь в том, как все работает, у вас будет два пути - либо вы поймете что код на самом деле не так плох, и почерпнете для себя несколько хороших идей, либо окончательно убедитесь что код и в самом деле говно, но с полноценным набором причин, а не теми, что вы описали. Сейчас ваше описание выглядит просто как неаргументированная паника разработчика, который столкнулся с чем-то отличным от базового стека. Анализируйте, изучайте. То, как не надо делать - это тоже хороший опыт.
    Ответ написан
    Комментировать
  • Как изменить размер блока при hover, чтобы другие блоки не уезжали?

    @twolegs
    Контейнер карточки с position: relative, а сам контент нужно поместить в блок с position: absolute.
    Абсолютно позиционированные элементы не будут влиять на положение других.
    Ответ написан
    Комментировать
  • Как сделать чтобы при клике на кнопку, mouseEvent был span, а не его содержимое (только чистый JS)?

    @twolegs
    Используйте e.currentTarget вместо e.target.
    Либо передавайте в функцию сам объект, а не ивент (что более правильно на мой взгляд): that.scroll(this.scrollBtn)
    Ответ написан
  • Как с бэкенда ловить ошибки на фронтенде?

    @twolegs
    Ошибка должна быть в теле запроса.
    Обработка ошибок на клиенте зависит от того, каким образом вы отправляете запросы (fetch, axios и т.п.).
    Как правило, тело ошибочного ответа можно получить в catch у промиса.

    Если это фетч, то ошибочный респонз надо предварительно распарсить (response.json() или response.text()). Кроме того, по умолчанию фетч не реджектит промис, если ответ пришел не со статусом 200, так что это тоже надо обработать
    if (response.status >= 200 && response.status < 300) {
        return Promise.resolve(response);
      } else {
         return Promise.reject(response.json())
      }
    Ответ написан
    Комментировать
  • Как решить 13 задачу Эйлера?

    @twolegs
    Тип number в js не целочисленный, поэтому при суммировании таких больших чисел могут быть потери.
    Попробуйте использовать BigInt, может быть с ним будет работать. Но вообще эта задача предполагает аналитическое решение, а не решение в "лоб".
    Ответ написан
  • Как правильно перезапустить функцию?

    @twolegs
    Особо не вдавался в подробности, но:
    1. game_end должен чистить переменную this.inited. Поэтому дальше таймаута не уходит.
    2. game_end должен чистить ивент листенеры, которые навешивает game_start
    Ответ написан
    2 комментария
  • Вызов функции внутри другой функции?

    @twolegs
    У вас название функции с большой буквы, а вызываете вы ее с маленькой. Приведите регистр к одному виду, и все заработает.
    Ответ написан
    Комментировать
  • Почему очищается поле ввода текста?

    @twolegs
    const onDrop = useCallback(async (acceptedFiles) => {
        const newImage = acceptedFiles[0];
        let hasError;
    
        if (newImage.size > allowedMaximumFileSize) {
          hasError = true;
    
          alert("Размер файла не допустим");
        }
    
        if (!allowedMimeTypes.includes(newImage.type)) {
          hasError = true;
    
          alert("Тип файла не допустим");
        }
    
        if (!hasError) {
          const previewBASE64 = await fileReader(newImage);
    
          onImageChange(name, { file: newImage, preview: previewBASE64 });
        }
      }, []);


    Вот тут у вас в массиве зависимостей нет onImageChange. Соответственно, всегда выполняется onImageChange с изначальным значением (то есть пустыми полями).

    P.S. Если добавить в зависимости onImageChange, то мемоизация будет бесполезна, потому выше вы создаете эту функцию каждый рендер.
    Ответ написан
    3 комментария
  • Как правильно возвращать получившийся state в редьюсере?

    @twolegs
    Редьюсер должен быть чистой функцией, то есть не содержать в себе сайд-эффектов. В нем не должно быть ничего асинхронного. Для асинхронных операций в redux есть middleware, например redux-thunk.
    Ответ написан
    3 комментария
  • Как организовать сложные вычисления в NodeJS?

    @twolegs
    SSR не такая уж сложная задача. Если он выполняется очень долго - тут уже вопросы к оптимизации вашего приложения.
    Вообще, в первую очередь вам нужно ответить на два вопроса:
    1. На какую нагрузку вы рассчитываете? Сколько rps ожидается?
    2. Проводили ли вы уже какое-то нагрузочное тестирование? Вы уверены, что сейчас вам не хватит одного инстанса ноды?
    Если количество запросов велико и один инстанс не справляется - я бы использовал поднял пару инстансов ноды с помощью, например, pm2, который выступит в роли балансировщика.
    Вообще, в случае веб разработки на node, не так часто в основном потоке выполняются какие-то действительно сложные вычисления, наибольшие задержки приходятся на IO/операции с БД и другие асинхронные штуки. Остальные ваши сложные вычисления действительно сильно забивают основной поток? В этом случае да, лучше использовать workers, они в отдельном потоке запускаются.
    Ответ написан
    2 комментария
  • Применимо ли к React структура приложений из JS?

    @twolegs
    React - это только View-слой приложения, поэтому остальную логику вы можете организовать так, как вам хочется. То, что react+redux - это самый популярный стек, не означает, что это единственно правильная архитектура.
    Вполне можно реализовать классическое MVC-приложение с использованием React на фронтенде. Но тут, опять же, следует исходить из самого приложения. Если оно достаточно простое, лишние абстракции могут быть ни к чему.
    Ответ написан
    Комментировать
  • Рекурсия внутри цикла в js, ЧТО здесь вообще происходит?

    @twolegs
    Расставил отступы, чтобы было видно что на каком уровне вложенности выполняется.
    start 3
        start 2
            start 1
                start 0
            end
            start 0
        end
        start 1
            start 0
        end
    end
    start 2
        start 1
            start 0
        end
        start 0
    end


    Возможные причины выноса мозга:
    1. end не выводится после 0. Т.е. вероятно, вы для себя неправильно расставили все соответствия при выводе.
    2. Цикл всегда ограничен двумя итерациями.
    Ответ написан
    Комментировать
  • Как обновить react компонент после изменения в объекте?

    @twolegs
    Во-первых, у вас каждый рендер будет создаваться новый экземпляр объекта FactorModel(). Т.е. каждую итерацию рендера у вас заново инициализированный объект.
    Чтобы этого избежать, надо либо мемоизировать этот инстанс (хук useMemo), либо инстанцировать объект вне компонента (если это возможно).
    Во-вторых, эффект также вызывается каждый рендер, и на событие каждый раз подписывается новая функция (память течет). Чтобы этого избежать, нужно указать второй параметр в useEffect: useEffect(..., []) - такой эффект выполнится только при монтировании компонента.
    Ответ написан
    Комментировать
  • Как оптимальнее сделать сетку на svg?

    @twolegs
    Все зависит от задачи, которую решаете. Думаю, правильнее всего будет реализовать варианты и провести их тест, сравнив производительность в ваших задачах.
    Как 5-й вариант могу предложить fill паттерном: tutorials.jenkov.com/svg/fill-patterns.html
    Ответ написан
    1 комментарий
  • Как красиво обойти AST и получить нужные данные?

    @twolegs
    Если вас смущает только количество кода, то это решается банальным форматированием.
    Например, если использовать одну вспомогательную переменную, то код уже становится чище.
    walk(obj, () => {}, (obj) => {
      const nodeValue = obj.children[0].value;
      if (nodeValue.value == 'placeholder' || nodeValue.value == 'button') {
        arr.push({
          [nodeValue.value]: {
            index: nodeValue.loc.start.line,
            loc: obj.loc
          }
        });
      }

    Также часть кода можно обернуть в отдельные функции, тогда он станет компактнее.
    Большое количество одинаковых условий можно заменить на более простое
    ['placeholder', 'button', ...].includes(node.value);
    Ответ написан
    Комментировать