Ответы пользователя по тегу JavaScript
  • Как это работает?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Это просто демонстрация того, как выполнять длинные циклические вычисления без подвешивания браузера.
    Функция делает миллион проходов цикла, затем проверяет, достиг ли счётчик миллиарда. Если достиг, то выводит сообщение и завершается. Если нет, то функция ставит себя в очередь макрозадач вызовом setTimeout с нулевым временем. Перед повторным вызовом функции из очереди будут выполнены все накопившиеся за время работы цикла макро- и микрозадачи (события, промисы, другие сработавшие таймауты и интервалы).
    Ответ написан
    5 комментариев
  • Как записать результат работы цикла в переменную и вывести алертом?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Promise.all(
      URL.map(
        (url) => fetch(url)
          .then((response) => `${url} : ${response.status} ${response.statusText}`)
          .catch((e) => `${url} : ${e.message}`),
      ),
    )
    .then(
      (results) =>
        alert(results.join("\n")),
    );


    var unresolved = URL.length;
    var results = [];
    for (i = 0; i < URL.length; i += 1) {
      (function(i) {
        var request = new XMLHttpRequest();
        request.open("GET", URL[i]);
        request.onreadystatechange = function (event) {
          console.log(request);
          if (request.readyState === 4) {
            if (request.status === 200) {
              results[i] = URL[i] + ' РАБОТАЕТ';
            } else {
              results[i] = URL[i] + ' НЕ РАБОТАЕТ';
            }
            unresolved -= 1;
            console.log(unresolved);
            if (unresolved === 0) {
              alert(results.join("\n"));
            }
          }
        }
        request.send();
      })(i);
    }
    Ответ написан
  • Как сделать Datapicker всегда видимым?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Прочитать документацию
    https://jqueryui.com/datepicker/#inline
    Ответ написан
    1 комментарий
  • Для чего нужен Promise.resolve, если он не срабатывает в Promise?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Promise.resolve(value) - это статический метод, возвращающий промис в состоянии fulfilled с указанным значением.
    Эквивалент new Promise((resolve) => resolve(value))
    И можно как-то выполнить промис без аргументов?
    Что значит "выполнить"? Создать можно, сменить статус с pending на fulfilled нельзя, на rejected можно по исключению.
    P.S. Если вас смущает то, что и там и там используется resolve, то в new Promise это всего лишь название переменной для каллбэка в функции. Оно может быть любым.
    new Promise((แก้ไข) => แก้ไข('Решено'));
    //Promise { <state>: "fulfilled", <value>: "Решено" }
    Ответ написан
    Комментировать
  • Как сформировать файл из текста полученного от бэка?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Примерно так:
    const text = 'Текст для сохранения';
    const blob = new Blob([text], { type: 'text/plain' });
    const content = URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = content;
    link.download = 'test.txt';
    document.body.appendChild(link);
    const click = new Event('click');
    link.dispatchEvent(click);
    link.remove();
    Ответ написан
    Комментировать
  • Как выполнить JSON.parse если на входе невалидная строка?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Приходит всегда одинаковый набор полей в одинаковом порядке? Если да, то можно разобрать регуляркой.
    const str = "{'id':'147','name':'example's name1','address':'sample street 1'}";
    const [_, id, name, address] = str.match(/{'id':'(.*?)','name':'(.*?)','address':'(.*?)'}/);
    console.log(id); // 147
    console.log(name); // example's name1
    console.log(address); // sample street 1

    Или так:
    const re = /{'id':'(?<id>.*?)','name':'(?<name>.*?)','address':'(?<address>.*?)'}/;
    const result = re.exec("{'id':'147','name':'example's name1','address':'sample street 1'}");
    console.log(result.groups);
    // Object { id: "147", name: "example's name1", address: "sample street 1" }
    Ответ написан
    Комментировать
  • Как правильно прописать условия для фильтра?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    = - присваивание
    == - нестрогое сравнение
    === - строгое сравнение
    Ответ написан
    Комментировать
  • Как исправить ошибку "Политика одного источника не разрешает чтение удаленного ресурса"?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    https://developer.mozilla.org/en/docs/Web/HTTP/CORS
    Если вкратце, то доступ со страницы, открытой в браузере с одного домена (foo.com) к другому домену (buz.com) требует, чтобы сервер buz.com возвращал заголовки явно разрешающие доступ для foo.com.
    Это ограничение вшито в браузеры и обходится проксированием запроса через свой бэкенд.
    Скрипт в браузере со страницы foo.com обращается к бэкенду foo.com, тот делает запрос к buz.com и возвращает ответ браузеру.
    Ответ написан
    Комментировать
  • Отслеживание новых записей в бд в реальном времени?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Самое простое - периодический запрос клиентом обновлённой информации.
    Более сложное - websocket + вызов скрипта из БД по триггеру AFTER INSERT.
    Ответ написан
  • Как сделать, чтобы отправлялись данные об ошибке?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const increaseSalary = async () => {
      try {
        const employees = await api.getEmployees();
        const employee = employees.reduce(
          (acc, cur) => (acc.salary > cur.salary ? cur : acc),
          { salary: Infinity },
        );
        const newSalary = (employee.salary * 1.2) | 0;
        const result = await api.setEmployeeSalary(employee.id, newSalary);
        if (result.salary !== newSalary) {
          throw 'API Error, salary has not increased';
        }
        await api.notifyEmployee(
          employee.id,
          `Hello, ${employee.name}! Congratulations, your new salary is ${newSalary}!`,
        );
        return true;
      } catch (e) {
        api.notifyAdmin(e.message);
        return false;
      }
    });
    Ответ написан
    3 комментария
  • Как реализовать такое сравнение строк, JS?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Не надо никаких библиотек. Всё есть в штатных функциях.
    'е'.localeCompare('ё', 'ru', { sensitivity: 'base' })
    // 0
    Ответ написан
    2 комментария
  • Метод map. Как создать массив объектов?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Можете. Напишите функцию, которая из исходного объекта делает нужный вам, и используйте эту функцию в map.
    Ответ написан
    Комментировать
  • Почему не работает код в firefox?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вам с бэка возвращается не JSON. Ищите ошибке на бэке, firefox тут не при чём.
    Ответ написан
    Комментировать
  • Является ли указанная функция function expression?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Является. Здесь функция создаётся в правой части присваивания, то есть в выражении.
    Дополнительный признак - только в function expression можно опустить имя функции.
    Ответ написан
    2 комментария
  • Как правильно обработать ошибки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В чем проблема?
    В отсутствии функции foo, неиспользовании аргумента в getData, попытке сравнения экземпляра с классом и, возможно, слишком большой глубине рекурсии.
    Да, и ещё, отсутствующий аргумент - это не null.
    Ответ написан
    Комментировать
  • Как преобразовать цифровое написание числа в текстовое написание?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Подскажите с чем это связано?
    С тем, чтоMath.trunc(256 / 10) === 25
    Сначала разбейте число на сотни, десятки и единицы, а потом уже формируйте строку. Не забудьте блок 11-19 и вариант, когда на входе 0.
    Ответ написан
  • Как сделать, что бы данная функция выполнялась последовательно?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    async function foo(
      for (id of id_contacts) {
        const responce = await axios(...);
      }
      await axios(...)
    }
    Ответ написан
    Комментировать
  • Как правильно объединить объекты?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const temp = data.reduce(
      (acc, cur) => {
        acc.bank_props[cur.bank_props.id] = cur.bank_props;
        acc.settlements[cur.bank_props.id] = cur.settlements;
        return acc;
      },
      { bank_props: {}, settlements: {} }
    );
    const result = {
      bank_props: Object.values(temp.bank_props),
      settlements: Object.values(temp.settlements),
    };
    Ответ написан
    Комментировать
  • Объясните почему не работает сравнение следующих строк?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Внимательно посмотрите в HEX-редакторе на свою строку.
    ON️[ON OFF] - 4F 4E EF B8 8F 5B 4F 4E 20 4F 46 46 5D
    Видите группу EF B8 8F ? Это неотображаемый символ U+FE0F (Variation Selector-16), который модифицирует отображение предыдущего символа. Он попадает в первую группу при сплите, соответственно строка без такого символа не равна строке с ним.
    Ответ написан
    3 комментария
  • Можете объяснить асинхронность в JS?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    WebAPI браузера поедоставляет вещи типа setTimeout, или async await, коллбек-функции которые закидываются в очередь, а оттуда в порядке своей приоритетности попадают в стек по очереди. Промисы обрабатываются в приоритетном порядке.
    Обычные callback-функции не попадают в очередь, они вызываются в общем стеке. Кроме промисов в приоритетную очередь микрозадач функция может быть добавлена через queueMicrotask(function).
    А что если "асинхронные" операции занимают много памяти и выполняются долго. Если они выполняются в том же стеке, то они также перекроют доступ ко всем остальным операциям?
    Асинхронные операции выполняются отдельными служебными потоками параллельно с основным стеком. Поэтому сами они не могут заблокировать основной стек. По завершению/таймеру асинхронная операция кладёт функцию в очередь микро- или макрозадач.
    Ответ написан
    Комментировать