Задать вопрос
  • Почему takeUntil для отписки Observable лучше размещать в конце pipe?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    Потому что завершенный обсервабл может быть переключен на другой, который не завершится.
    По этой же причине и от хттп надо отписываться, одноразовый запрос может быть переключен на другой и за ним не уследишь.
    Ответ написан
    3 комментария
  • Как вести себя в ситуации, когда клиент хочет написать заявление в полицию?

    wanhelsing
    @wanhelsing
    Да никуда он не напишет. Просто он смекнул что тебя можно иметь и разводить, вот и решил блефануть, вдруг прокатит. Ты лучше сам ему напиши что подашь заявление в полицию.
    Ответ написан
    Комментировать
  • Чем именно виртуальный дом выигрывает в обновлении в сравнение с реальным домом?

    Почему в реальном доме нельзя таким же образом менять только те узлы которые изменились?

    Если меняешь только 1 узел, разницы практически не будет.
    Если меняешь целое дерево - уже сложнее.
    Если писать руками, то можно пойти двумя путями:
    1. Снести всё (под)дерево в реальном доме, а потом построить новое заново
    2. Руками пройтись по дереву в реальном доме и изменить только те узлы, в которых реально поменялись данные.

    Второй вариант будет экономить на вставках, но тогда придётся все элементы вычитывать из дома, а если это будет происходить в цикле, или просто очень часто, то возникнут заметные тормоза.
    По-хорошему надо сохранять и кэшировать элементы, чтобы их по 10 раз не вычитывать.

    Вот этим virtual DOM и занимается вместо разработчика.

    Много где читал что изменения в виртуальном доме вызывает изменение всего дом дерева так ли это?

    Это плохой сценарий, если используется что-то неправильно, или если реально надо перестроить всё дерево.

    В конечном результате всё-равно виртуальный дом сравнивается с реальным изменяет только некоторые узлы, так почему сразу не сравнивать узлы которые изменились с реальным домом?

    Описал выше - получится тогда vdom, либо потеряешь очень много производительности из-за постоянных запросов к дому.

    Почему обновление реального дома очень затратно И как так получилось что создание новой абстракции в виде виртуального дома сделала его только быстрее?

    Затратно, тк это обращение к API браузера, которое медленнее, чем просто обратиться к объекту в JS.
    А выигрыш из-за того что мало кто хочет самостоятельно писать такую абстракцию для эффективной работы с реальным DOM.
    Ответ написан
    Комментировать
  • Где хранить большой массив объектов в реакт приложении?

    Zraza
    @Zraza
    Помог ответ? Отметь решением!
    Мой взгляд, на истину не претендую:

    Я сторонник того, что на клиенте вообще не стоит хранить большие объемы данных. Т.е. запрашивает только те, которые нам нужны для работы/отображения в конкретный момент. Все фильтры/сортировка/пагинация на стороне сервера. Понятно, что это не всегда возможно, поэтому идем дальше...

    В хранении большого объема данных в редаксе не вижу ничего плохого, если они редко меняются. Если часто - неприятно, нужно поддерживать иммутабельность, затраты на garbage collector.
    Плюсы - быстрый доступ до данных, т.к. хранятся они в памяти.
    Минусы - поддержка иммутабельности и затраты на память.

    Если уж отходить от редакса - можно воспользоваться каким-то стором на основе мутабельных объектов, например mobx.

    Если всё это держать в памяти не хочется - то действительно можно взять IndexedDB. Хранится на диске, между перезагрузками сохраняется, асинхронное апи, есть индексы по полям. Нужно учесть, что на браузерах в режиме инкогнито может не работать или работать ограниченно (для предотвращения отслеживания).

    Ну и, конечно, вопрос в объеме данных. Просто 2к объектов - не то, чтобы сильно много. Вопрос, насколько тяжелых объектов.
    Ответ написан
    2 комментария
  • Соглашаться ли получать меньше на испытательном сроке?

    fdroid
    @fdroid
    press any key
    Нет.

    PS Предложите взамен работать на 30% меньше, тогда справедливо будет.
    Ответ написан
    9 комментариев
  • Как преобразовать Promis.all в последовательные запросы?

    Как советуют выше, проще всего использовать async-await и цикл for-of, но если нет возможности их использовать, то тогда можно просто построить цепочку промисов, примерно вот так:
    const promises = [
      Promise.resolve("first"), 
      Promise.resolve("second"), 
      Promise.resolve("last")
    ];
    
    function makePromiseChain(arrayOfPromises) {
      return arrayOfPromises.reduce((acc, current) => acc.then(() => current, Promise.resolve()));
    }
    
    makePromiseChain(promises).then(() => {
      console.log("done");
    });


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

    // если в проекте есть lodash, то в нём есть метод _.chunk
    function makeChunks(array, chunkSize) {
      const chunks = [];
      for (let i = 0, j = array.length; i < j; i += chunkSize) {
        const chunk = array.slice(i, i + chunkSize);
        chunks.push(chunk);
      }
      return chunks;
    }
    
    // выполняем запросы параллельно по 3 штуки
    makePromiseChain(
      makeChunks(promises, 3)
        .map(chunk => Promise.all(chunk))
    ).then(() => console.log('Done'))
    Ответ написан
    Комментировать
  • Как приукрасить правду так, чтобы твоё резюме заметили и предложили собеседование?

    verkhoturov
    @verkhoturov
    Frontend Developer
    Суть вопроса: "Как приукрасить резюме, которое я вам не покажу".
    Вполне вероятно, что вам резюме не нужно украшать, а сделать его хотя бы читабельным. Но мы этого уже не узнаем :)
    Ответ написан
    Комментировать
  • Почему не работает MutationObserver?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    MutationObserver не реагирует на удаление элемента, за которым он следит. Надо следить за childList родительской ноды.
    Ответ написан
    Комментировать
  • ООП в JS отличается сильно от ООП компилируемых языков?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    3 принципа ООП - это миф, притом очень вредный.
    Инкапсуляция, наследование и полиморфизм относятся к ООП примерно как кухонный комбайн к варке блюд, их конечно можно использовать вместе, но и друг без друга они живут прекрасно.

    ООП - это про высокоуровневые абстракции представленные в виде объектов, а так же про взаимодействие этих объектов, путем вызова методов. Все. Никаких 3 принципов тут нет. И это примерно одинаково, что в JS, что в C#, что в Java, что в C++, а разница в реализации тут не существенна, Вы о ней знаете, только потому что абстракции текут.

    Инкапсуляция - это сокрытие сложности. Опять же все. Забудьте весь бред про приватные поля и тому подобное. Это не более чем частный случай. И замыкания - это тоже частный случай инкапсуляции. А еще, когда из модуля Вы экспортируете не все подряд (привет ReasonML), а только высокоуровневые штуки, оставляя все остальное недоступным извне. А еще когда некоторое API (REST/GraphQL/RPC/etc.) отгораживает Вас от прямого общения с базой данных - это тоже инкапсуляция.

    Полиморфизм - это возможность некоторой сущности работать с разными типами данных и возможно адаптироваться под них. А еще полиморфизм разный бывает. Помимо полиморфизма подтипов, который чаще всего и приписывают к ООП, бывают и другие. Например очень распространен параметрический полиморфизм, в большинстве языков представленный дженериками. А еще бывает ad-hoc полиморфизм (перегрузки).
    Но даже если рассматривать только полиморфизм подтипов (это когда между типами есть иерархия, то есть отношения подтип-надтип, и мы в переменную/аргумент/поле надтипа можем присвоить значение подтипа), то и тут нет не слова про ООП. Яркий пример - TypeScript, где есть тип unknown, являющийся надтипом любого другого типа и в который можно присвоить значение любого типа, а так же есть тип never, являющийся подтипом любого другого типа и который можно присвоить в любой другой тип.
    Ну и касательно JS, в нем вообще все полиморфно, ибо динамическая типизация.

    Наследование - это вообще частный случай полиморфизма подтипов, отдельно выделяют пожалуй лишь потому, что он не только про типы (как полиморфизм), а еще и про реализации, которые наследуются. И опять же, ничего тут про ООП нет. Наследование вполне может жить и без ООП,
    например во вполне себе структурно-процедурном Си
    #include <stdio.h>
    
    struct Parent
    {
        int a;
        int b;
    };
    
    struct Child
    {
        struct Parent __super;
        int c;
    };
    
    void f(struct Parent* v)
    {
        printf("a: %d\nb: %d\n", v->a, v->b);
    }
    
    int main()
    {
        struct Child v = {{10, 20}, 30};
        f((struct Parent*)&v);
        printf("c: %d\n", v.c);
        return 0;
    }


    P.S. JS вполне себе компилируемый язык, у v8 даже ассемблерный код попросить можно, который он накомпилит с Вашего JS.
    Ответ написан
    1 комментарий
  • Как реализовать правосторонний бинарный поиск?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Уберите проверку на совпадение внутри while. Присваивайте границам интервала mid, а не mid+1 или -1.
    Ответ написан
    Комментировать
  • Как посчитать количество функций в коде JS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Такие задачи однозначно решаются обходом AST. Возьмите общеизвестный парсер и инструмент для обхода его дерева, например связка из @babel/parser и @babel/traverse подойдет.
    Так же можно посмотреть в какие ноды что парсится с помощью https://astexplorer.net/ - в нем несколько языков, а для js/ts на выбор есть несколько парсеров.
    Вам по сути нужно найти FunctionDeclaration содержащий в body ReturnStatement и извлечь из него Identifier соответствующий имени. А для второй части - FunctionDeclaration с ArgumentsList не нулевой длины.
    Ну и так как в условии сказано, что внутрь не заходить, то можно пройтись лишь по верхнему уровню, тогда @babel/traverse и не нужен даже
    Ответ написан
    3 комментария
  • Как написать функцию которая возвращает все комбинации, меняя одну цифру в строке?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const xxx = ([...str]) => [...new Set(Array.from(
      { length: str.length * 10 },
      (n, i) => str.map((m, j) => (j === (i / 10 | 0)) ? i % 10 : m).join('')
    ))];
    Ответ написан
    Комментировать
  • Qwerty1234567890?

    verkhoturov
    @verkhoturov
    Frontend Developer
    Привет!

    1) Нужно убрать опыт кладовщика.
    Из-за него тебя тяжело найти на hh. Например, HR который ищет junior минимум опыта (всякое бывает :)) просто не увидит твое резюме из-за суммарного с кладовщиком опыта в 4 года.

    2) Если ты какую-то технологию изучал, но не использовал в проектах или только планируешь изучать, не пиши об этом. Тоже самое касается нерелевантного опыта работы. Это бесполезная информация.
    В "Обо мне" удаляй:
    Историю про кладовщика и вот эти фразы про технологии - "Изучил БЭМ. (дальше буду верстать с применением этой методологии)", "Планирую учить TypeScript", "Немного практиковался с фреймворком Angular".

    3) В целом, советую переписать "Обо мне". То что у тебя мало опыто видно и без пояснений, а желание учиться и быть полезным тоже сомнительная история для hr.
    (в IT все любят учиться, ни кого не удивишь этим)

    3.1) Ссылка на codewars некорретная

    4) Портфолио в резюме раздели по технологиям, неудобно искать где у тебя просто верстка, а где React \ Vue.
    В идеале, краткое пояснение к каждому проекту, что использовал. На один набор технологий - один проект. Нет смысла смотреть на 5 похожих сайтов сделанных просто на html + sass

    5) Удали из портфолио пример верстки эл. письма, оно сделано неверно.
    Опечатка в теге header, в эл. письмах не работают флексы, ограничено работают псеводоэлементы и еще много всего. Почтовое приложение такое письмо просто поломает и большая часть пользователей получат поехавшую верстку.
    Какие CSS свойства работают в письмах можно посмотреть тут, а вот пример хорошего шаблона эл. письма.

    Первую работу найти тяжело, привыкай рассылать очень много резюме каждый день.
    А еще когда берешь тестовые задания, договаривайтесь чтобы давали задачу не более чем на 3-4 часа. Если делаешь намного дольше, не трать свое и чужое время, значит пока не подходишь (но для себя можно и доделать). Если потенциальный работодатель настаивает на тестовом более чем на 4 - 6 часов, отказывайся, это мутная контора, лучше за это время сходить на пару других собеседований.
    Ответ написан
    2 комментария
  • Как из библиотеки JQuery перисать на читый Js?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ответ написан
    Комментировать
  • Почему getBoundingClientRect считает не правильно высоту?

    @cheeroque
    Вы родителю .item присваиваете высоту .hidden. Там ещё label рядом лежит, у которого своя высота есть + бордер + маргин. Замените 70 в расчёте h на высоту лейбла + его нижний маргин, и логика будет правильной. А ещё лучше просто сделайте так: let h = parent.scrollHeight;
    Ответ написан
    Комментировать
  • Почему обучение продвигается так медленно?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    А вы ждали мгновенного результата? Месяц - это очень мало. За месяц даже учебник для начинающих нормально не изучить. На тренировку мозга требуются существенно больше времени. Стартовый уровень, достаточный для найма, нарабатывается полгода-год. Пара-тройка лет практики в окружении профессионалов нужна, чтобы вырасти в мидлы. И процесс не останавливается никогда, чем больше вы тренируетесь, тем больший спектр задач можете решать и тем проще это вам даётся. Продолжайте стараться, всё придётся при должном упорстве.
    Ответ написан
    8 комментариев
  • Как понять достоин ли ты более лучшей зар.платы или ещё не дорос и не надо высовываться даже?

    opium
    @opium
    Просто люблю качественно работать
    Чувак о каком достоин может быть речь если тебе не хватает грубо говоря на Доширак чтобы не умереть с голоду?
    Тебе повышения зп процентов на 50 чтобы не умереть вот и все, о каком достоинстве может идти речь?
    Или может ты их какого то знатного рода, тогда зачем ты работаешь за еду.
    Я понимаю когда там программист получает 200к и задаётся вопросом может я достоин получать 600к

    В таком случае речь идёт о выживании, либо поднять зп на текущем месте либо устроиться на новую работу и тут думать даже не о чем
    Ответ написан
    21 комментарий
  • Переработка в маленьких IT-компаниях?

    @lonelymyp
    Хочу вылезти из минуса по карме.
    Да конечно, в маленьких компаниях, где один человек на фронт, один на бэк и один студент верстальщик, постоянные перекосы производительности, в мелкой конторке руководитель будет один для всех, который и будет тебя постоянно просить поработать за соседа. Петя не успевает с фронтом, давайте все поможем Пете, а через неделю Вася не успевает с бэком, давайте все поможем Васе.
    Чем больше штат, тем меньше переработок чужих, если 20 человек в трёх отделах занимаются бэком а ещё 20 фронтом, крайне маловероятно что попросят делать чужую работу чужого отдела, у тебя своих тасков на месяц вперёд запланировано, никто не даст тебе бросить своё и заниматься чем-то другим.
    Ответ написан
    Комментировать
  • Почему Typescript считает аргумент функции корректным?

    Тайпскрипт использует структурную типизацию, а не номинативную.
    Это значит, что он смотрит не на имена типов, а на их содержимое-структуру.
    И вот по структуре Invalid user расширяет Valid user.

    Побороться с этим можно, если ввести какую-нибудь несовместимость между этими интерфейсами.
    Например добавив поле type с некоторым константным строковым знаяением
    Ответ написан
    2 комментария