Задать вопрос
Ответы пользователя по тегу JavaScript
  • Почему функция не работает?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ну во-первых, чего Вы хотели добиться вот этим кодом?
    for (const letter of target) {
      if ( letter.toLowerCase() !== letter.toUpperCase() ) {
        direct = letter + direct;
        reversed = letter + reversed;
      }
    }


    Во-вторых, данная задача легко решается за O(n/2), а у Вас как минимум тут O(n):target.split('').reverse().join('')

    Нормальный алгоритм для этой задачи такой:
    1. Заводим 2 переменные под индексы символов, одна будет смотреть на начало строки (изначальный индекс 0), другая на конец строки (изначальный индекс target.length - 1).
    2. Идем циклом по строке с обоих сторон, увеличивая первый индекс и уменьшая второй на каждой итерации.
    2.1. Если символ под индексом не подходящий (пробел, знак препинания и т.д.), то его надо пропустить, сместив соответствующий индекс еще на 1 вне очереди. Подсказка: если нужна только латиница, то ее коды символов лежат в диапазонах 65-90 и 97-122 (у строки есть метод charCodeAt), для кириллицы диапазоны 1072-1103, 1040-1071, 1105, 1025.
    2.2. Если текущие символы строки, с учетом приведения их к единому регистру не равны, то можно дальше не проверять и сразу возвращать false.
    2.3. Если индексы стали равны или пересекли друг друга (индекс с конца меньше индекса с начала), то можно однозначно возвращать true.
    Ответ написан
    Комментировать
  • Как округлить целое число?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Отбросить лишние разряды с нужной точностью:
    function truncInteger(number, precision) {
      return number - (number % precision);
    }
    console.log(truncInteger(1000040, 100));
    console.log(truncInteger(1200040, 100));

    Математическое округление:
    function roundInteger(number, precision) {
      return Math.round(number / precision) * precision;
    }
    console.log(roundInteger(1000040, 100));
    console.log(roundInteger(1200040, 100));
    console.log(roundInteger(1000080, 100));
    console.log(roundInteger(1200080, 100));
    Ответ написан
    Комментировать
  • Как реализуется enum в JS из Typescript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Можете, пожалуйста, объяснить, что выполняет эта часть кода: (Membership || (Membership = {})
    Если в Membership не falsy значение (например объект), то передать ссылку на него в функцию, иначе (если в Membership undefined) присвоить в Membership новый объект и передать ссылку на него в функцию

    И почему это всё обёрнуто в функцию?
    Сложно сказать, думаю кто-то скопировал код отсюда в код сюда и не стал париться, так как в обоих случаях есть declaration merging, о котором уже написал Aetae

    А вообще стоит узнать про const enum, который не оставляет артефактов в JS и в подавляющем большинстве случаев его достаточно.
    Ответ написан
    Комментировать
  • В чем разница между pdf.js и pdfjs-dist?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    но зачем скомпилированную версию называть отдельным именем и выделять под нее отдельный репозиторий
    dist репозиторий может автоматически разворачиваться на CDN через CI или push-хук, при этом в нем нет исходников и на него может быть ограниченный доступ на запись, а в репо с исходниками нет артефактов сборки. Кроме того можно быстро откатить кривой релиз через revert.
    Ну и у github нормальный CI появился относительно недавно, и старые проекты вполне могут использовать такую схему.

    Что-то я не пойму в чем разница между pdf.js и pdfjs-dist?
    В одном лежат исходники, в другом собранные бандлы.

    Правильный вариант - это или подключать собранный бандл с CDN или ставить с npm и собирать самому.
    Ответ написан
  • Как зациклить setTimeOut?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const preloadImages = document.querySelectorAll('.pr-bub');
    const preloadImagesAnimationInterval = setInterval((state) => {
        const item = preloadImages[state.index];
        item.classList.toggle('animationPreBub', state.addClass);
        state.index--;
        if (state.index < 0) {
            state.addClass = !state.addClass;
            state.index = preloadImages.length - 1;
        }
    }, 300, {
        addClass: true,
        index: preloadImages.length - 1,
    });
    Ответ написан
    3 комментария
  • Являются ли промисы асинхронными?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    new Promise(resolve => {
      // здесь код выполняется синхронно
      resolve();
    }).then(() => {
      // здесь уже асинхронно, в ближайшем микротаске после вызова resolve выше
    });
    
    Promise.resolve().then(() => {
      // здесь тоже асинхронно, в ближайшем микротаске
    });


    много вычислений
    Это не про асинхронность.
    Асинхронность - это про кооперативную многозадачность, то есть промис может только отложить вычисления на потом, но они все равно заблокируют поток, который у JS всего один.
    А для "много вычислений" без блокирования основного потока, эти "много вычислений" нужно выносить в отдельный поток. В JS для этого есть воркеры. А вот уже результат от воркера можно ждать асинхронно.
    Ответ написан
    Комментировать
  • Почему не работает child_process electron?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Скорее всего проблема с путями для 'easyvk.js'.
    Во-первых, лучше всегда вычислять абсолютный путь до файла.
    Во-вторых, electron-packager пакует приложение в asar, и если require пропатчен для работы с ним, то child_process скорее всего нет и нужен анпакинг файла перед запуском.
    Ответ написан
  • Вопросы по REST API?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Во-первых, REST - это не стандарт, не строгие правила, это рекомендации.
    Вся суть этих рекомендаций сводится к двум вещам:
    - Каждый ресурс (документ, данные о сущности) имеет свой собственный URI
    - Для каждого действия с ресурсом предлагается в соответствие свой HTTP метод запроса

    Теперь по вопросам:
    1. Если данные json и html - это просто разные представления одного ресурса, то они вполне могут жить на одном URI. Например разное представление отдается в зависимости от HTTP заголовка Accept.
    2. REST никак не регламентирует, как Вам строить приложение. Это может быть отдельный запрос к сущности "роль" или быть частью сущности "пользователь", решать Вам.
    3. Опять же, REST тут вообще не причем. В REST нет никаких БД, сессий или еще чего либо, что Вы там под капотом используете инкапсулировано от клиента.
    4. CSRF делается как и в любом другом случае. Вот статья есть: https://habr.com/ru/post/318748/
    Ответ написан
    4 комментария
  • Почему не происходит перерисовка в самописном react-redux?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    state.firstname = action.payload.firstname;тут Вы мутируете предыдущий стейт, что потенциально может привести к невозможности сравнить стейты.

    reducer(state, action);возвращаемый стейт никуда не записывается

    callback();А вот тут может быть потенциально ошибка, так как callback может быть undefined
    Ответ написан
    1 комментарий
  • Как изменить значение обьекта на имя?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Object.keys(object[key]) = newobject[key];
    Вот на этой строчке у Вас ошибка, в JS нельзя присвоить что-то любому выражению, только переменной или полю объекта.
    Ответ написан
    Комментировать
  • Почему в объекте Response нет самого ответа?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Промис возвращаемый fetch() не ждет завершения всего запроса, он резолвится когда получены все заголовки.
    На этом месте их можно обработать и решить что делать дальше, например читать json, текст или бинарные данные из тела, или вообще не обрабатывать тело и прервать запрос.
    Так же можно читать тело ответа в виде потока, как уже указал в своем ответе Надим Закиров

    Второй промис из response.text() и response.json() нужен чтоб дождаться считывания всего тела ответа, притом response.json() еще и позволяет браузеру парсить json из ответа потоково прямо во время скачивания, опять же не блокируя поток js/ui.
    Ответ написан
    5 комментариев
  • Как преобразовать curl с параметром --data в fetch с методом get?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если данные передаются в url в виде GET параметров:
    const url = new URL('http://127.0.0.1:8000/api/feed/posts/');
    url.searchParams.append('page', 1);
    
    fetch(url, {
      headers: {
        Authorization: 'Token a96a3545bb566272f0fdfb405a0cccb7173da660',
      },
    });
    Ответ написан
    Комментировать
  • Как переписать промис через async/await?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Код на then ждет промис из wait, а код на await нет
    await wait(2);
    Ответ написан
  • Почему сообщения в консоль выводятся не по порядку массива?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Promise.all(arr.map(p => {
        const link = `http://195.112.117.82:5080/photo?tov_code_internet=${encodeURIComponent(p)}`;
        return new Promise(resolve => {
            $.get(link, resolve);
        });
    })).then(dataArr => {
        for (const data of dataArr) {
            const $obj = $(data);
    
            const content = $obj[19].innerHTML;
            const title =   $obj[7].innerText;
    
            // по хорошему регулярки надо вынести наверх,
            // чтобы они компилировались 1 раз
            const text = content
                .replace(/[\n\r]/g, ' ')
                .replace (/\s{2,}/g, ' ');
    
            console.log(text + " " + title);
        }
    }).catch(err => {
        console.error(err);
    });
    Ответ написан
    Комментировать
  • Как решить проблему с WebSockets?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вы на каждый запрос по http, который обрабатывается Вашим middleware делаете подписку на websocket connection, тем самым плодите обработчики.
    У Вас вебсокет вообще никак не связан с http и сидит на отдельном порту.

    При желании, кстати можно переиспользовать инстанс http сервера и для express и для websocket, тогда они на одном порту будут.
    Ответ написан
    3 комментария
  • Почему ошибка Uncaught TypeError: Failed to construct 'URL': Invalid URL?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const network = "http://localhost:8899";для solana-test-validator
    Или URL реальной сети, в которой крутится нужная программа, если продакшен
    Ответ написан
    Комментировать
  • Можно ли реализовать такое с помощью js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Можно.

    Вариант 1: зашить html код блока строкой в JS и вставлять через DOM операции в страницу, например через insertAdjacentHTML.

    Вариант 2: использовать шаблонизаторы, такие как handlebarsjs, по сути то же, что и вариант 1, но еще и позволит просто подставлять данные в HTML.

    Вариант 3: использовать UI фреймворк или библиотеку, такие как svelte, vue или react.

    Ну и маленький совет, если у Вас будет отдельный скрипт, который чисто выводит Ваш header на страницу, то подключать его можно прямо в месте расположения header, но подключать его нужно с атрибутом async, что бы он не мешал загрузке остальной страницы. И вставлять HTML код в этом случае можно относительно тега script, получить который можно через document.currentScript
    Ответ написан
    Комментировать