• Как передать объект в класс js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Можно записать объект в свойство prototype временной функции и наследоваться от нее:
    function fromPrototype(proto) {
        function F() {}
        F.protoype = proto;
        return F;
    }
    
    const obj = {
        _sayHi() {
            console.log(`Hello, my name is ${this.name}!`);
        },
    };
    
    class Person extends fromPrototype(obj) {
        constructor(name, age) {
            this.name = name;
            this.age = age;
          
           if (this.age < 0 ) {
                this.age = 0;
            }
        }
    }
    Ответ написан
    2 комментария
  • Как подключить и использовать json конфиг в rust?

    bingo347
    @bingo347
    Crazy on performance...
    В константах как не странно можно использовать только константы.
    Варианта 2:
    1. Написать процедурный макрос, который прочитает нужный JSON в компайл-тайм и сгенерирует код константы, так кстати и саму структуру можно генерировать.
    2. Зашить байты JSON в бинарь через макрос include_bytes!, а парсить при старте программы или в lazy_static.

    Но вообще у меня есть ощущение, что Вы в принципе неправильно решаете свою задачу. Константы - это по своей сути компайл-тайм сущности, а смысл конфига обычно - получить параметры в ран-тайм.
    Скорее всего Вам достаточно будет простого lazy_static
    Ответ написан
    5 комментариев
  • Как удалить папку WSL?

    bingo347
    @bingo347
    Crazy on performance...
    Не отключая WSL - никак, потому что это не папка, а специальный шорткат проводника на виртуальную сеть WSL.
    Ну и да, начиная с win11 WSL включен по умолчанию, так как в планах запуск андроид приложений, а андроид как не странно - это Linux.
    Но по идее, если отключить WSL в системных компонентах, то и шорткат из проводника должен исчезнуть.
    Ответ написан
    Комментировать
  • Как сделать, чтобы событие вызывалось один раз?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Проблема вот тут:
    const remove = this.on(events

    Метод on у Вас ничего не возвращает, соответственно в remove будет undefined, функции там взяться неоткуда.
    Переменной events нет в скоупе данного метода, очевидно имелась в виду eventName

    А вообще, вместо массива колбэков для события лучше использовать Set, так метод off будет работать за O(1), а не за O(n) как сейчас.

    В методе once можно подписываться на событие через метод on, и отписываться через метод off при его наступлении (так например делает EventEmitter из node.js). Но стоит учесть момент, что off должен работать и для once событий, а у Вас будет записан колбэк созданный в once, а не тот, что передал пользователь. Вообще проще хранить 2 коллекции: для многоразовых для одноразовых событий, ну или параметризовать колбэки (тогда лучше хранить их в Map, где ключи - колбэки, а значения - их параметры).

    Ну и еще обратите внимание, что у Вас в методах emit и once колбэк пользователя вызывается по разному:
    callback.apply(this, args) и callback.call(null, args)
    Ответ написан
    1 комментарий
  • Как итерировать несколько объектов в одном цикле RUST?

    bingo347
    @bingo347
    Crazy on performance...
    let a = [1, 2];
    let b = [3, 4];
    for (a, b) in a.into_iter().zip(b.into_iter()) {
        println!("{a}, {b}");
    }

    Метод zip есть у любого объекта реализующего трэйт итератора
    https://doc.rust-lang.org/std/iter/trait.Iterator....
    Ответ написан
    Комментировать
  • Какой нужен фреймворк для js, под мою задачу?

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

    bingo347
    @bingo347
    Crazy on performance...
    git checkout <хэш нужного коммита>
    git checkout -b <имя новой ветки>

    И продолжаем разработку в этой ветке.
    Или если просто собрать приложение, то можно и без новой ветки
    Ответ написан
    Комментировать
  • Какая есть идиома для проверки [null]?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Мне нужно из: [null] получить просто []

    Если таких null много в вперемешку с полезными значениями, то можно отфильтровать:arr = arr.filter(el => el !== null);
    Ответ написан
    Комментировать
  • Стоит ли адаптировать сайт под IE 10 в 2022-м году?

    bingo347
    @bingo347
    Crazy on performance...
    С 15 июня IE в принципе больше не работает, можно не поддерживать.
    Safari как был болью похлеще IE, так ей и остается.
    А так подавляющее большинство браузеров сегодня основаны на Chromium, ну и Firefox еще есть немного.
    Ответ написан
    Комментировать
  • Что лучше использовать чтобы сделать задержку для отправки комментария?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    На клиенте просто делаем для кнопки:
    button.disable = true;
    setTimeout(() => {
      button.disable = false;
    }, 60_000);

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

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Потому, что undefined в js - это специальное значение, суть которого быть значением по умолчанию для неинициализированных переменных.
    То есть инициализация переменной значением undefined - это все равно, что инициализация значением по умолчанию.
    Когда Вы в сигнатуре функции пишете b = 10 - это означает, что инициализируй b значением 10 если там инициализация по умолчанию (undefined).
    Ответ написан
    Комментировать
  • Удалил большой файл, а оно всё равно не пушится и жалуется на этот файл, как исправить?

    bingo347
    @bingo347
    Crazy on performance...
    Даже если Вы сделали коммит с удалением большого файла, он все равно остается в истории git, а значит будет заливаться на удаленный репозиторий.

    Можно сделать так:
    1. Сделать git checkout на коммит перед тем, где был добавлен большой файл
    2. Создать от этого коммита новую ветку.
    3. Если в коммите, где был добавлен большой файл, были другие изменения, то воспроизвести их (скорее всего вручную, но может кто еще подскажет как это автоматизировать).
    4. Сделать git cherry-pick последующих коммитов из старой ветки в новую.
    5. Удалить старую ветку и переименовать новую в то как называлась старая.

    UPD: по 3 пункту, думаю можно взять diff проблемного коммита, убрать из него добавление большого файла, а затем накатить этот исправленный diff как patch.
    Ответ написан
  • Как проверить токен?

    bingo347
    @bingo347
    Crazy on performance...
    Как лучше проверить токен сохраненный в localstorage при заходе на сайт?
    Хранить токен в localStorage - не очень хорошая идея, так как любой скрипт на любой странице сайта сможет прочитать такой токен и сделать с ним что угодно (например отправить на свой сервер для последующего массового взлома).

    отправлять холостой запрос на авторизованный эндпоинт и если приходит 401 то менять статус?
    Токен должен отправляться в каждый запрос, который требует не гостевых привилегий, иначе смысла нет в токене.

    Единственный адекватный на сегодня вариант хранения токенов - это кука с флагами secure и http-only.
    Флаг secure обеспечит, что кука будет доступна только по https.
    Флаг http-only не даст доступ к этой куке из JS, прочитать ее сможет только сервер.
    Ответ написан
    Комментировать
  • Все циклы, кроме for..in, могут работать только с итерируемыми объектами?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    С итерируемыми объектами работают только циклы for-of и for-await-of.

    В современном JS есть следующие виды циклов:

    1. while - цикл с условием
    // где condition - это некоторое выражение, которое можно скастовать к boolean
    while (condition) {
    }
    Данный цикл выполняется, пока условие condition истинно.

    2. do-while - цикл с постусловием
    do {
    } while (condition);
    Данный цикл выполняется как минимум 1 раз, условие condition проверяется после тела цикла и если оно истинно - запускается следующая итерация.

    3. for - цикл с инициализацией, условием и финальным выражением
    for (init; condition; final_expression) {
    }
    
    // основное применение - это цикл со счетчиком, но в целом мы не ограничены в применении
    for (let i = 0; i < 10; ++i) {
    }
    Перед циклом выполняется init, который может быть выражением или оператором объявления переменных (var, let, const). Перед каждой итерацией проверяется условие condition, пока это условие истинно - цикл будет выполняться. После каждой итерации выполняется final_expression.

    4. for-in - цикл по ключам объекта
    // где object - это некоторое выражение, которое можно скастовать к типу object
    for (const key in object) {
    }
    Данный цикл перебирает все перечислимые ключи самого объекта и всех объектов из его цепочки прототипов. Может работать медленно, а ключи из прототипа обычно не требуются, поэтому данный цикл не рекомендуется использовать.

    5. for-of - цикл по итерируемым объектам
    // где iterable - это некоторый объект с методом Symbol.iterator
    for (const value_variable of iterable) {
    }
    Перед итерацией создает итератор вызывая iterable[Symbol.iterator](), перед каждой итерацией дергает метод next у итератора, работает пока в возвращаемом из метода next объекте поле done не станет true, подставляет поле value в переменную value_variable. Цикл в примере выше можно реализовать в виде обычного for:
    {
      const iter = [1, 2, 3][Symbol.iterator]();
      for (let {done, value} = iter.next(); !done; ({done, value} = iter.next())) {
        const value_variable = value;
        {
          // тело исходного цикла
        }
      }
    }


    6. for-await-of - цикл по асинхронно итерируемым объектам
    // где iterable - это некоторый объект с методом Symbol.asyncIterator или методом Symbol.iterator
    for await (const value_variable of iterable) {
    }
    Перед итерацией создает итератор, одним из следующих способов:
    Если в объекте iterable есть метод Symbol.asyncIterator - то вызывает его.
    В противном случае вызывает метод Symbol.iterator.
    В остальном работает как for-of, с той разницей, что дополнительно применяет оператор await к значению итератора и в value_variable попадает то, что вернул данный await.
    Ответ написан
    Комментировать
  • Существует ли способ быстро запускать текущий файл в среде NodeJS?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    1. В корне проекта создайте папку .vscode (если ее еще нет)
    2. Создайте в папке .vscode файл tasks.json со следующим содержимым:
    {
      "version": "2.0.0",
      "tasks": [
        {
          "label": "Run current file in node.js",
          "type": "shell",
          "command": "node",
          "args": ["${file}"]
        }
      ]
    }
    Если такой файл уже есть, то просто дополните массив tasks содержимым выше.
    3. Нажмите Ctrl+Shift+P и введите команду Preferences: Open Keyboard Shortcuts (JSON), должен открыться файл keybindings.json, добавьте в конец массива следующий объект:
    {
      "key": "alt+f5",
      "command": "workbench.action.tasks.runTask",
      "args": "Run current file in node.js",
      "when": "editorTextFocus && editorLangId == javascript"
    }


    Все, теперь по Alt+F5 в тектовом редакторе будет запускаться текущий файл нодой, если он js файл
    Ответ написан
    1 комментарий
  • Как создать свой шаблон для autocomplete (или Intellisense)?

    bingo347
    @bingo347
    Crazy on performance...
    Комментировать
  • Как лучше организовать API для работы с websockets?

    bingo347
    @bingo347
    Crazy on performance...
    WebSocket подразумевает постоянное соединение с сервером, разные эндпоинты подразумевают разные соединения, что само по себе дорого и не дает ни каких преимуществ.
    Притом WebSocket - это двусторонняя связь, любая сторона (и клиент и сервер) может отправить свое сообщение в любой момент времени. Как правило поверх WebSocket используют какой-либо RPC протокол чтобы реализовать механизм запрос-ответ и маршрутизировать различные запросы.
    Ответ написан
    Комментировать