Ответы пользователя по тегу Node.js
  • Как бороться с зависанием промисов?

    @alexeyproject
    По сути ваш код сводится к следующему:
    while (true) {
        console.log(1);
    }
    и отсюда уже не выходит.
    А если подробнее, то:
    1. При вызове f1(), сразу в этом же eventloop (т.е. синхронно) начинает выполняться ее код
    2. setTimeout-ом только планируем поставить через 100 мс в macrotask функцию на выполнение. А это какой-то из следующих eventloop-ов.
    3. Попадаем в бесконечный while и отсюда уже не выходим.

    Смотрите в этой статье Задачи, микрозадачи, очереди и планы, если хотите разобраться. К сожалению оригинал Tasks, microtasks, queues and schedules не доступен. Там был классный интерактивный пример.
    По сути вызов асинхронной функции эквивалентен созданию промиса.
    Что вы хотели сделать в примере не совсем понятно.
    Ответ написан
  • Как верно сделать тик 1 секунды?

    @alexeyproject
    Вывод с максимально приближенным значением к текущему времени, с корректировкой на время выполнения функции-обработчика
    function startTimer(cb) {
        var timer = {running: true};
        
        function interval() {
            if (timer.running === false) return;
            console.log('tick: ', (new Date()).toISOString());
            cb();
            setTimeout(interval, 1100 - (Date.now() + 100) % 1000);
        }
        setTimeout(interval, 1100 - (Date.now() + 100) % 1000);
        return timer;
    }
    
    function stopTimer(timer) {
        timer.running = false;
    }
    
    // test
    function payload() {
        var start = Date.now();
        for (var i = 0; i < 10000000; i++); // нагрузка
        var stop = Date.now();
        console.log('payload:', stop - start)
    }
    
    var timer = startTimer(payload);

    Обратите внимание на 1100 - (Date.now() + 100) % 1000
    Здесь происходит сдвиг от нулевой позиции, чтобы между вызовами таймеров было более 100мс.
    Эту цифру можно регулировать. Как известно между вызовами не может быть менее 4мс, поэтому (учитывая небольшой запас) не рекомендую ставить меньше 10мс. При данном значении максимальное время выполнения обработчика, для избежания пропуска таймера, будет 989мс, если обработчик будет выполнятся дольше, то очередной вызов будет пропущен.
    Ответ написан
    Комментировать