• Почему код выдаёт неправильный результат?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Когда что-то не понятно, просто распишите каждый шаг, который происходит в программе:
    // запомнили в x значение 0
    x = 0;
    // запомнили в y значение -200
    y = -200;
    
    // тут выражение из нескольких действий
    x = 0 * x + 1 * y
    // 1. вместо переменных подставим значения
    // 0 * 0 + 1 * -200
    // 2. посчитаем умножения
    // 0 + -200
    // 3. посчитаем сложения
    // -200
    // запомним -200 в x
    
    // на этом этапе у нас в x запомнено -200 и в y тоже -200
    
    // с этим проделайте по аналогии
    y = -1 * x + 0 * y
    Ответ написан
    Комментировать
  • Почему игнорируется .append(elem)?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function render(message) {
      const p = document.createElement("p"); // создали p, его еще нигде нет в DOM, все ok
      p.textContent = message;
      windowChatUser1.append(p); // поместили наш p в windowChatUser1, с этого момента он есть в DOM
      windowChatUser2.append(p); // переместили наш p в windowChatUser2
    }
    логично, что из windowChatUser1 наш p исчез при перемещении в windowChatUser2, так как один элемент не может быть в двух родителях сразу
    Делайте глубокий клон при втором добавлении:windowChatUser2.append(p.cloneNode(true));
    Ответ написан
    1 комментарий
  • Не работает vh, wh, в чем может быть причина?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Слайдер растягивается содержимым, слайдам просто не от чего считать 100% высоты, которые им заданы
    .slider__slide {
      /* изменяем внешний контейнер на viewport величины */
       height: 100vh;
       width: 100vw;
    }
    /* прописываем высоту внутренним контейнерам */
    .slick-list, .slick-track {
      height: 100%;
    }
    Ответ написан
    Комментировать
  • Как можно корректно написать асинхронный метод у объекта в typescript с дженериком?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В дополнение к Aetae - дженерик здесь тоже не нужен
    Да, парсинг JSON возвращает any (по историческим причинам) и его вот таким дженериком можно легко кастануть в любой тип. Только зачем вообще использовать TypeScript если мы вечно его затыкаем своей правотой?
    Даже если данные приходят с нашего сервера, и мы точно знаем их тип - их нужно проверять, ибо нет гарантии, что никто не ошибся на бэке, что мы не ошиблись в описании типа в который кастуем.
    Поэтому должен быть тип unknown, чтоб TypeScript требовал все проверить перед использованием:
    const ApiServiceModule = {
      get: (url: string): Promise<unknown> => fetch(url)
        .then(response => response.json())
        .catch(err => console.error(err))
    }
    Ответ написан
    Комментировать
  • Как сделать условие JavaScript с помощью setinterval?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ошибка в точке запятой после ifif (document.URL.indexOf("/testurl/") != -1);if обрабатывает пустую операцию, все что дальше уже вне if

    Поэтому всегда заключайте тело условий и циклов в фигурные скобки.

    Нормальный вариант уже предложен Absolute138

    Но остается вопрос, зачем здесь вообще интервал?
    Ответ написан
    2 комментария
  • Функция валидации которая выбрасывает исключения?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Возвращайте Result, Ok при успешной валидации или Err с ошибкой при неудачной, а после соединяете все ошибки и выводите пользователю информацию
    При throw приложение падает, Вы конечно можете поймать throw через try-catch, но он приведет Вас к полному хаосу в Вашем коде и нестабильному приложению. А кроме того, нет возможности обработать все валидации за раз, если первая упадет, об остальных юзер узнает только когда исправит данные, как думаете, на какой раз он пошлет Ваше приложение?
    Ответ написан
  • Как типизировать dispatch функции?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    сделайте вот так: setError(e.message)(dispatch) вместо
    dispatch(setError(e.message)) // здесь возникает ошибка, т.к. setError возвращает функцию
    и все будет правильно сразу
    Ответ написан
    Комментировать
  • Как из массива, представляющего дерево, извлечь корни?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    // проиндексируем по ключам
    const [rootIndex, idIndex] = array.reduce(([roots, ids], obj) => {
      (roots[obj.root_id] ??= []).push(obj);
      ids[obj.id] = obj;
      return [roots, ids];
    }, [{}, {}]);
    // и найдем по нему нужные объекты:
    const objectsWithoutExistingParent = Object.keys(rootIndex).filter(key => !idIndex.hasOwnProperty(key)).flatMap(key => rootIndex[key]);
    console.log(objectsWithoutExistingParent);

    Конечно чуть больше кода, чем у 0xD34F, зато с линейной сложностью
    P.S. а я все жду, когда 0xD34F начнет впаривать факториальную сложность новичкам, а то с квадратичной веб конечно тормозит, но не такими темпами...
    Ответ написан
    Комментировать
  • Как с эмулирувать работу метода push?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    let b = ['test', 5, 12];
    function func(...args) {
      b.splice(b.length, 0, ...args);
      return b.length;
    }
    Ответ написан
    Комментировать
  • Как запустить gulp таск с параметром?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    https://gulpjs.com/docs/en/api/series/
    Читать документацию и смотреть, что функция принимает - не, лучше задать вопрос на QnA...

    const html = (lang) => () => {
      return gulp.src("source/*.html")
        .pipe(rename({suffix: lang}))
        .pipe(gulp.dest("build"));
    };
    exports.html = html;
    Ответ написан
  • Почему не получается отправить POST запрос через Axios?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В переменной host на сервере должен быть localhost, чтоб так работало, а не хост сервера (или что там у Вас).

    Origin можно чекать динамически, если Вас опрашивают более 1 хоста:
    https://github.com/expressjs/cors#configuring-cors...

    А еще можно передать туда RegExp или массив строк/RegExp:
    https://github.com/expressjs/cors#configuration-options
    Ответ написан
    Комментировать
  • Как отправить массив через бинарные протоколы?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Комментировать
  • Почему не удаляется событие?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    проблем с удалением событий не было
    Разве?
    В обоих вариантах обработчики не будут удаляться.
    В removeEventListener нужно передавать тот же самый listener, что и был передан в addEventListener.
    Обратите внимание, что именно не такой же, а тот же самый.
    ТО есть вот так удалится:
    const listener = event => console.log(event);
    element.addEventListener('click', listener);
    element.removeEventListener('click', listener);

    А так уже нет:
    element.addEventListener('click', event => console.log(event));
    element.removeEventListener('click', event => console.log(event));
    ибо это 2 разные функции, не смотря на то, что делают одно и то же, и одинаковы до каждого символа.

    P.S.
    когда программировал в функциональном стиле
    то что в обоих Ваших примерах - это процедурный стиль. От того что Вы завернули код в класс - он не становится ООП, как и то что написали набор функции - не ФП.
    Ответ написан
    6 комментариев
  • Как сделать функцию sum в javascript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function sum(value) {
      return (function next(previousSum) {
        return Object.defineProperty(function nextSum(value) {
          return next(previousSum + Number(value));
        }, 'valueOf', {value() {
          return previousSum;
        }});
      })(Number(value));
    }

    Тест от 0xD34F проходит:
    one = sum(1)
    two = one(1)
    three = one + two // 3
    Ответ написан
    Комментировать
  • Почему при выполнении скрипта node.js увеличивается занятая RAM?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Давайте посмотрим, что Вы тут накодили... Я уберу Ваши комментарии из кода и добавлю свои:
    const setup = {port:8000}
    const express = require ('express');
    const puppeteer = require('puppeteer');
    
    const app = express ();
    
    app.get('/', (req, res) => {
        const url = req.query.url;
    
        // вот тут Вы на каждый запрос создаете весьма тяжелую функцию
        // в ней 203 AST ноды
        // и она жрет в среднем 220КБ оперативы
        // (node: 14.4.0; v8: 8.1.307.31-node.33, мерил через process.memoryUsage().heapUsed)
        let scrape = async () => {
    
            // а еще на каждый запрос запускам новый браузер
            // у ноды это особо памяти не отнимет, а вот у системы - прилично
            const browser = await puppeteer.launch({args: ['--no-sandbox']});
            const page = await browser.newPage();
    
            // еще и разрешаем запросу из браузера жить вечно
            // если конечно сервак не оборвет коннект
            await page.setDefaultNavigationTimeout(0);
    
            await page.setUserAgent('Mozilla/5.0 (Linux; Android 7.0; NEM-L51) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.81 Mobile Safari/537.36');
            await page.setViewport({width: 375, height: 812});
    
            // куда мы отправляем браузер?
            // переменная url у нас из req.query.url - а следовательно начинается с /
            // то есть без хоста и протокола...
            await page.goto(url);
    
            // что-то мне подсказывает, что это работает не совсем так
            // как Вы ожидаете
            // https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageevaluatepagefunction-args
            // читаем: If the function passed to the page.evaluate returns a non-Serializable value, then page.evaluate resolves to undefined
            const bottomSheet = await page.evaluate(() => {
                return document.querySelector('div[data-marker="bottom-sheet"]');
            });
    
            // так как undefined !== null данное условие всегда истинно
            if (bottomSheet !== null) {
                // здесь по идее придет Promise.reject который мы не ловим (об этом ниже)
                await page.click('div[data-marker="bottom-sheet"] button');
            }
    
            // и еще раз... ловите доку на нужный метод:
            // https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageselector
            const phoneButton = await page.evaluate(() => {
                return document.querySelector('a[data-marker="item-contact-bar/call"]');
            });
    
            // всегда ложное условие...
            if (phoneButton === null) {
                await browser.close();
                return false; // ...с return внутри...
            }
    
            // еще 1 способ зависнуть (дефолтный таймаут 30 сек)
            await page.waitForSelector('a[data-marker="item-contact-bar/call"]');
    
            await page.click('a[data-marker="item-contact-bar/call"]');
    
            try {
                await page.waitForSelector('span[data-marker="phone-popup/phone-number"]');
            } catch (e) {
                await browser.close();
                return false;
            }
    
    
            const result = await page.evaluate(() => {
                console.log('phone', document.querySelector('span[data-marker="phone-popup/phone-number"]'));
                return document.querySelector('span[data-marker="phone-popup/phone-number"]').innerHTML;
    
            });
    
            await browser.close();
            return result;
    
        };
    
        // не ловим reject промиса
        // и в случае reject не завершаем запрос
        // и он тоже висит в памяти
        scrape().then((value) => {
            console.log(value);
            if (value === false)
                res.send(500);
            // при value === false будет запись в закрытый поток... (или у express есть защита от дурака?)
            res.send(value);
            // абсолютно бесполезное действие...
            scrape = null;
        });
    });
    
    
    app.get('/test', (req, res) => {
        res.send('Тест');
    });
    
    app.listen(setup.port, () => {
        console.log('Сервер: порт %s - старт!', setup.port);
    });
    Ответ написан
    1 комментарий
  • Как мне получить ответ от сервера, учитывая, что я ему отправил POST-запрос?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Комментировать
  • Прокинуть Props с использование TS?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    export const Auth: React.FC = () => {
        const onChange1 = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {}, []);
        const onChange2 = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {}, []);
        return(
                <Child  Parent = {{onChange1, onChange2}}/>
        )
    }

    P.S. тут фигурные скобочки пропустили:
    export const Child: React.FC<Props> = ({onChange1, onChange2}) => {
    Ответ написан
    3 комментария
  • Почему может падать программа с exit code: 0xc0000005, STATUS_ACCESS_VIOLATION?

    bingo347
    @bingo347
    Crazy on performance...
    Для начала стоит переписать все без unsafe (он здесь совсем не нужен)
    Вместо некорректного шаринга уникальных ссылок IS_FILE_READ используйте AtomicBool
    С CHAR_BUFFER тоже нарушили правило либо 1 mut/uniq borrow либо много shared borrow, заверните в Mutex, а лучше, учитывая однонаправленность данных передавайте через channel
    Ответ написан
  • Удаление обработчика (removeEventListener)?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вы должны передавать в removeEventListener в точности тот объект/функцию, которые и передали в addEventListener
    В случае использования объекта с интерфейсом handleEvent - этот объект будет и передан в handleEvent функцию в качестве this (судя по коду Вы это поняли), так как removeEventListener вызывается из обработчика, то можно туда отдать this:drWr[this.d].removeEventListener('click', this);
    P.S. arguments.callee является устаревшим, не стоит его использовать
    Ответ написан
    Комментировать
  • Вычисление строк и столбцов которые монотонно спадают?

    bingo347
    @bingo347
    Crazy on performance...
    Мне кажется речь про это: https://ru.wikipedia.org/wiki/Монотонная_функция
    Проще говоря, если для каждой ячейки строки/столбца работает правило cell[i] >= cell[i - 1], то строка/столбец подходят под условия задачи и их нужно посчитать
    Ответ написан
    2 комментария