• Node.js setImmediate, setTimeout, как работают?

    @gmiroslav Автор вопроса
    Aves: Убираем первые тики
    setImmediate(() => {
    	setTimeout(()=> {
    		setImmediate(() => {
    			console.log('immediate 0');
    			setTimeout(() => console.log('timeout 3'), 0);
    			setImmediate(() => console.log('immediate 3'));
    			setTimeout(() => console.log('timeout 4'), 0);
    			setImmediate(() => console.log('immediate 4'));
    			const t = Date.now();
    			while (Date.now() - t <= 1);
    		}, 0);
    		setTimeout(() => {
    			console.log('timeout 0');
    			setTimeout(() => console.log('timeout 1'), 0);
    			setImmediate(() => console.log('immediate 1'));
    			setTimeout(() => console.log('timeout 2'), 0);
    			setImmediate(() => console.log('immediate 2'));
    		}, 0);
    	});
    })


    Снова рандом
  • Node.js setImmediate, setTimeout, как работают?

    @gmiroslav Автор вопроса
    Aves: окей, я понял, у них у каждого свой очередь, но есть еще нюанс
    setTimeout(()=>{
    		setImmediate(() => {
    			console.log('immediate 0');
    			setTimeout(() => console.log('timeout 3'), 0);
    			setImmediate(() => console.log('immediate 3'));
    			setTimeout(() => console.log('timeout 4'), 0);
    			setImmediate(() => console.log('immediate 4'));
    			const t = Date.now();
    			while (Date.now() - t <= 1);
    		}, 0);
    		setTimeout(() => {
    			console.log('timeout 0');
    			setTimeout(() => console.log('timeout 1'), 0);
    			setImmediate(() => console.log('immediate 1'));
    			setTimeout(() => console.log('timeout 2'), 0);
    			setImmediate(() => console.log('immediate 2'));
    		}, 0);
    	});


    вот тут immediate 0 должен быть всегда раньше timeout 0, да? Но к сожалению снова рандом
  • Node.js setImmediate, setTimeout, как работают?

    @gmiroslav Автор вопроса
    Aves: timers -> I/O -> immediates, тут наибольший приоритет у таймерс или у иммедиейт?
  • Node.js setImmediate, setTimeout, как работают?

    @gmiroslav Автор вопроса
    Aves:
    окей, теперь лучше понятно, но:
    setTimeout(() => {
    setTimeout(() => console.log('timeout 0'), 0);
    setImmediate(() => console.log('immediate'));
    }, 0);

    тут внутри уже второй тик, правильно? и таймаут должен всегда быть первым?
  • Node.js setImmediate, setTimeout, как работают?

    @gmiroslav Автор вопроса
    Aves: убираем первый тик вообще!! :

    process.nextTick(() => {
    setTimeout(() => console.log('1'), 0);
    setTimeout(() => console.log('2'), 0);
    setImmediate(() => console.log('4'));
    setImmediate(() => console.log('5'));
    process.nextTick(() => {
    setTimeout(() => console.log('3'), 0);
    setImmediate(() => console.log('6'));
    })
    });

    Результаты:
    1 2 3 4 5 6
    и
    4 5 6 1 2 3,
    то есть они срабатывают пачками, в основном таймаут раньше, но бывает наоборот. Почему так... непонятно. Вашу Теорию с первым тиком мы опровергнули, да?
  • Node.js setImmediate, setTimeout, как работают?

    @gmiroslav Автор вопроса
    Aves: Я прочитал, но не очень понимаю, если честно.

    setTimeout(() => console.log('1'), 0);
    setImmediate(() => console.log('2'));

    process.nextTick(() => {
    setTimeout(() => console.log('3'), 0);
    setImmediate(() => console.log('4'));
    });

    у меня выполняется в таких порядках:
    1 3 2 4 и
    2 4 1 3

    Сделаем тяжелее
    setTimeout(() => console.log('1'), 0);
    setImmediate(() => console.log('2'));

    process.nextTick(() => {
    setTimeout(() => console.log('3'), 0);
    setTimeout(() => console.log('4'), 0);
    setImmediate(() => console.log('5'));
    setImmediate(() => console.log('6'));
    });

    Результаты:
    1 3 4 2 5 6
    и
    2 5 6 1 3 4

    Странное поведение уже на втором тике, да?
  • Node.js setImmediate, setTimeout, как работают?

    @gmiroslav Автор вопроса
    Если лаги, то ладно, но я думал есть четкая последовательность(
  • Node.js setImmediate, setTimeout, как работают?

    @gmiroslav Автор вопроса
    Если что, версия ноды 7.1.0
  • Node.js setImmediate, setTimeout, как работают?

    @gmiroslav Автор вопроса
    Aves:
    setImmediate(() => console.log('main setImmediate'));
    setTimeout(() => console.log('main setTimeout'), 0);

    process.nextTick(() => {
    setTimeout(() => console.log('nextTick setTimeout'), 0);
    setImmediate(() => console.log('nextTick setImmediate'));
    });

    запустите этот код раз 10, и вы убедитесь что все не так как вы говорите.
    если подключать fs const fs = require('fs');
    то все будет так работать как вы говорите, из-за того что тратится время на подключение модуля
  • Node.js setTimeout, setImmediate как работают?

    @gmiroslav Автор вопроса
    Первый пример если запустить раз 10, функции выполнятся в рандомном порядке, так и непонятно почему