• Иммутабельность строк?

    :-) Удачи в поедании кактусов. Решил помочь по доброте душевной, но не к коня корм.
  • Иммутабельность строк?

    Вот только "философии" не надо. Я указал на конкретный косяк - если в программе используются числовые данные, то в памяти они должны храниться именно числами. Для случая "напечатано на клавиатуре" - parseInt/isNaN/isFinite и дальше работа с числами.
  • Два js файла, как правильно поступить?

    "Программист" был криворукий, но не ленивый. Мержить на каждое изменение script.js в script_mobile.js - достойное ему наказание.
    Нормальному, чтобы не переделывать полностью, подключайте script_mobile.js (тот в котором дополнительные проверки), а до подключения что-то вроде:
    <?php if ($device == 'mobile' || $device == 'tablet') { ?>
    <script> var IS_MOBILE = true; </script><?php } ?>


    И потом в script_mobile.js вс места отличий обвешайте дополнительной проверкой:
    if (!IS_MOBILE || $(this).valid()) {
    ....
    }
    ....
    
    if(IS_MOBILE) $('form').validate();
  • Как вывести ошибку о том что браузер не поддерживает формат видео?

    Внутри тэга video можно текст вывести, который покажется если видео браузером не поддерживается.
    https://jsfiddle.net/artiz/9sfqghkz/
  • Можно ли (используют ли) один и тот же код (к примеру Angular или Vue) как для Веб, так и для Мобильных приложений?

    Weex спонсирует и вовсю использует Alibaba и инфы по нему море (правда на китайском :-).
    Берите, не пожалеете.
  • Как добавить сразу большой кусок дом дерева в div что бы работало в Edge?

    Попробуй DocumentFragment - https://davidwalsh.name/documentfragment
    1000 дивов вставил без проблем

    let frag = document.createDocumentFragment();
    for(let x = 0; x < 1000; x++) {
      let d = document.createElement("div");
      d.innerHTML = `<h4>item ${x}</h4>`;
      let svg = document.createElement("img");
      svg.width = 256; 
      svg.height = 256;
      svg.src = 'https://s3-us-west-2.amazonaws.com/svgporn.com/logos/expo.svg'
      d.appendChild(svg);
      frag.appendChild(d);
    }
    
    document.body.appendChild(frag);
  • Как снаружи прервать выполнение асинхронной функции?

    Ну что тут скажешь, удачи вам в поедании кактусов :-) За 8 лет в текущей конторе я отсобеседовал больше сотни JS-dev, встречались senior Angular Dev не знающие о track by, а уж Senior FullStack JS без знания EventLoop вы далеко не первый.
  • Как снаружи прервать выполнение асинхронной функции?

    Мощно, заменить обычный if (ctx.isCancelled) break; в ексепшн с разверской стека и заморочками с garbage collector - типичный хипстакод. Я за такое на собеседовании за nodeJS сразу бы минус влепил. Себе дороже потом с такими велосипедами разбираться.
    И таки потратьте 5 минут - https://developer.mozilla.org/en-US/docs/Web/JavaS...
    Умнеы люди пишут, что все таки не может быть "бизнес логике в 10к парарелльных async функций".
    Each message is processed completely before any other message is processed. This offers some nice properties when reasoning about your program, including the fact that whenever a function runs, it cannot be pre-empted and will run entirely before any other code runs (and can modify data the function manipulates). This differs from C, for instance, where if a function runs in a thread, it can be stopped at any point to run some other code in another thread.
  • Как снаружи прервать выполнение асинхронной функции?

    Дядя, вы дурак (с) Классика.
    fs.close/socket.destroty - это не прерывание read/write, а закрытие дескриптора. Операции чтения/записи прервать невозможно! Если уже в коде вызвано fs.read(), то пока нода не прочитает, остановить этот процесс нельзя. И даже если в этот момент "параллельно" вызвать fs.close() от ничего не случится, read свое прочитает при любых раскладах, и write запишет.
    'use strict';
    
    const assert = require('assert');
    const fs = require('fs');
    
    test();
    
    function test() {
      const a = fs.createWriteStream('a.txt');
      for (let i = 0; i < 5; ++i) 
        a.write('line\n', (e) => console.log('Write, e: ', e));
    
      a.close();
      a.on('open', () => a.close());
      a.on('error', console.error);
    }

    Первая строчка под виндой пишется, несмотря на close. Под линухом можети и несколько успеть записать.

    clearTimeout - это не прерывание испольнения функции, а выкидывание ее запланированного исполнения из лупа. А если она уже запущена, clearTimeout опустит руки и тупо вернет false. В crypto есть getRandomBytes с callback - просто в памяти всплыло, юзал недавно.
  • Как снаружи прервать выполнение асинхронной функции?

    WebWorker - это не многопоточность, а "многопроцессноть" - базовая вещь. Воркер работает в новом лупе и не имеет прямого доступа к объектам в основном лупе, общение возможно только черезх асинхронный же postMessage. Опять незнание основных вещей.
    И в последний раз - нет в JS "другой async функции". Нет тут параллельного исполнения, нет и все. Есть тупо один поток интерперетатора жующий EventLoop и в каждый момент времени ждущий, или выполняющий блок кода от начала и до конца (или до uncaughtException). А значит нет ни евентов, ни мьютексов, ни sharedmemory (это вроде появится, но тоже с ограничениями), а значит все что можно сделать - это взвести флаг или кинуть event 'abort', который опять же попадет в Loop и аллах знает когда дождется своей очереди, и даже с setImmediate

    Вот реальный код разворачивания async функции - никакой магии и один большой switch, где через _context таскаются локальные переменные и вешаются дополнительные методы для обработки выхода (abrupt, stop).

    return function () {
        var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(req, res) {
          var result;
          return _regenerator2.default.wrap(function _callee$(_context) {
            while (1) {
              switch (_context.prev = _context.next) {
                case 0:
                  _context.prev = 0;
                  _context.next = 3;
                  return action(req, res);
    
                case 3:
                  result = _context.sent;
                  return _context.abrupt('return', result);
    
                case 7:
                  _context.prev = 7;
                  _context.t0 = _context['catch'](0);
    
                  console.error('API error', _context.t0);
                  return _context.abrupt('return', res.status(500).json({
                    message: _context.t0.message || 'Server error',
                    code: _context.t0.code,
                    stack: _context.t0.stack
                  }));
    
                case 11:
                case 'end':
                  return _context.stop();
              }
            }
          }, _callee, _this, [[0, 7]]);
        }));
    
        return function (_x, _x2) {
          return _ref.apply(this, arguments);
        };
      }();

    И если на каждый чих здесь вешать token.isCancelled() то скорости коду это не добавит, и все равно вынудит добавлять в клиентском коде добавлять что-то типа:
    let res1 = null, res2= null;
    try {
      res1  = await action1();
      res2 = await action2(res1);
    } catch (e) {
     if(e instanceof AsyncCancellationError) { 
       if (res1 !== null) {
         console.log('action1 executed');
         // но action2 то все равно надо где-то вызвать!!!
        // вариант 1:
        queue.push(async () => { await action2(res1) })
        // вариант 2: 
       await new Promise(resolve => setTimeout(resolve, 500));
       res2 = await action2(res1); // callback-hell от которого как-раз и пытались избавиться
       }
       if (res2 !== null) console.log('action2 executed');
     }
    }
  • Как снаружи прервать выполнение асинхронной функции?

    Это абсолютно разные вещи. И cancellation должен поддерживаться исполнителем асинхронной операции, чего сегодня нет почти ни у кого. Простейший пример - fetch API, в котором убрали abort, потому как не понятно как его обрабатывать в случае абстракции над сетевым стеком.
    Большая часть системных модулей ноды (fs, crypto, net) не имеют поддержки abort, а значит или ее придется дописывать, или тупо игнорировать.
    С другой стороны ломается вся стройная картина цепочечных вызовов промисов - cancel в then не обработает, тогда в catch надо рулить новый эксепшн в котором как-то донести инфу о том в каком месте цепочки остановились. И в любом случае выходит костыль.
    Или, как в случае с prex, килотонны лишнего кода (register/unregister во всех catch), который делает абсолютно то же самое, что и старые добрые флаги, но в hipster way.
  • Как снаружи прервать выполнение асинхронной функции?

    Аргументированно написал - в JS нет многопоточности, вообще нет. А значит "снаружи" можно только убить поток интерпретатора. async/await внутри интерпретатора разворачиваются в конечные автоматы (см выхлоп Бабеля) на обычном switch и асинхронная функция превращается в набор вызовов ее частей и передачей локального состояния. И влезть в этот цикл никак не получится без препроцессинга JS по типу babel. Единственное рабочее решение как и во всех КА - флаги. Как вам уже объяснило выше 5 человек.
  • Как снаружи прервать выполнение асинхронной функции?

    Просто не вижу смысла трясти 15-ю годами опыта, на деле не имея представления о модели асинхронности в JS. И да, сетевое взаимодействие - это всегда request/response.
  • Как снаружи прервать выполнение асинхронной функции?

    Тем более, если уж "я работаю c event loop в различных вариациях уже больше 15 лет", то ерунду про технические ограничения v8/node не писали бы. И вопросы "Как снаружи прервать выполнение асинхронной функции?" не задавали. Это его фича, а не ограничения. И поэтому ноду и используют в очень ограниченной области веба.

    По поводу setTimeout - на в бизнес-логике на ноде их быть не должно. Нода подразумевает максимальный быстрый ответ на запрос, без лишних замыканий на request/response. И никакого синхронного кода типа for (of) на массивах из 10к элементов. Не устраивает - берите любой другой стек, вариантов море - Java,Scala,Python,go,Erlang,c++,.NET Core - https://www.techempower.com/benchmarks/#section=da...
  • Как снаружи прервать выполнение асинхронной функции?

    Михаил Юрьевич: Разберитесь для начала что такое async/await (сахар над промисами) в ноде и как работает EventLoop. Небольшая подсказка - в JS нет никакой возможности прервать выполнение функции снаружи кроме убийства процесса интерпретатора. А так - одного предложения "...может попасть на долгий sleep" достаточно, чтобы понять, что c JS вы знакомы очень слабо.
  • Как снаружи прервать выполнение асинхронной функции?

    Цирк с конями :-) В чем смысл выбирать ноду с ее однопоточной архитектурой, чтобы пилить очередной велосипед, который через полгода отправится на свалку? За setTimeout/setInterval в продакшн коде надо руки сразу по локоть рубить. Не умеете JavaScript готовить - берите golang, python3, c++ и т.д.
    И самое интересное - fibers - это не потоки, основной поток все равно остается единственным - это базовое ограничение v8 (и любого движка JS)
  • Video тег грузит видео два раза?

    Браузер не качает весь видос в один запрос, а использует range запсросы прости кликни на любую строчку в консоли хрома и увидишь хидеры типа Content-Range:bytes 0-9601582/9601583
    Соотвественно статистику надо писать когда приходит Range:bytes=0-
  • Шардинг MySQL и поиск по шардам?

    Еще раз - никто не шардит данее которые предполагается доставать в одном запросе. Юзеров, категории и т.п. Шардят независимые данные - для разных групп юзеров, языков и т.д.
    Вот схема хай-лоад сайта с шардингом (википедия) - https://upload.wikimedia.org/wikipedia/commons/4/4...
    юзера лежат в одной базе с репликацией, тексты для разных языков размазана по шардам.
    И если возникает вопрос "Например, на одной странице необходимо отобразить одновременно 10 юзеров (имя, аватар и т.п.), которые распределены по разным шардам. " - значит с понятиме шардинга его автор ни хрена не знаком. "счет простого добавления нового сервера (шарда)" - та же херня. Это называется репликация, но никак не шардинг.
  • Шардинг MySQL и поиск по шардам?

    Да все равно шардинг не нужен. Шардинг - последний вариант, когда другие уже не возможны.
    Кто мешает вынести сообщения юзеров в отдельную Монгу/Кассандру? В реляционной базе хранить переписку - очень непродуманное решение. Тут или джойнить таблицу юзеров из млн записей к десятку комментов на каждый вывод или кешировать все и везде (и тогда по памяти улетишь).
    А если еще и шардинг сверхе привинтить - то вообще сливай воду. "а необходимые данные о пользователях с других шардов хранить в каком-то поисковом движке/кеше типа ElasticSearch/Sphinx." - это тоже архитектурный шедевр. Полная копия базы юзеров (типа шардированной) в эластике, конечно, будет работь ошен быстро.

    Не, ну если хочется модное слово в резюме добавить, то дерзай, конечно. Мы же тебе не менеджер/заказчик.
  • Видел ли кто подобный datapicker/календарь на js/jquery?

    Уродский и неюзабельный дизайн, 15 раз кликать чтобы выбрать одну дату - за такое дизайнеру руки сразу по локоть отрубать надо. И именно потому таких контролов и нет в природе.