process.nextTick перед Promise.resolve().then?

Следующий код:

process.nextTick( () => console.log("nextTick 1") );
process.nextTick( () => { console.log("nextTick 2"); Promise.resolve("Resolved promise inside nextTick").then(console.log); })

Promise.resolve("Resolved promise 1").then(console.log);
Promise.reject("Rejected promise 2").catch(console.log);

setImmediate( () => {
    console.log("setImmediate");
    Promise.resolve("Resolved promise inside setImmediate").then(console.log);
    Promise.reject("Rejected promise inside setImmediate").catch(console.log);
    process.nextTick( () => console.log("nextTick 3") );
})

выводит это в узле v14.17.0

Resolved promise 1
Rejected promise 2
nextTick 1
nextTick 2
Resolved promise inside nextTick    
setImmediate
nextTick 3
Resolved promise inside setImmediate
Rejected promise inside setImmediate

Почему первые два обратных вызова Promise.then/catch вызываются перед обратными вызовами process.nextTick? Не должны ли обратные вызовы process.nextTick предшествовать обратным вызовам Promise, как в части setImmediate?


person Byte    schedule 12.06.2021    source источник
comment
обещания .then обрабатываются в очереди микрозадач, которая имеет более высокий приоритет, чем очередь событий, где обрабатывается nextTick   -  person Jaromanda X    schedule 12.06.2021
comment
@JaromandaX Но это означало бы, что nextTick 3 должен идти после обработчиков обещаний, которые запланированы из обратного вызова setImmediate   -  person Bergi    schedule 12.06.2021
comment
@Bergi вот что меня смущает   -  person Byte    schedule 12.06.2021
comment
@Bergi - я не знаю, что делает setImmediate :p - о, да .. просто читаю об этом, это действительно не имеет смысла !!!   -  person Jaromanda X    schedule 12.06.2021
comment
Связанный (но не совсем ответ): Как промисы узла попадают между nextTick и setImmediate? и setImmediate против nextTick. Я подозреваю, что это как-то объясняется в nodejs.org/en/ docs/guides/event-loop-timers-and-nexttick — или это ошибка.   -  person Bergi    schedule 12.06.2021
comment
здесь указано, что process.nextTick › обещает обратные вызовы – › github.com/nodejs/help/issues/ 1789   -  person Byte    schedule 12.06.2021
comment
Как вы выполняете этот скрипт? На моей машине (macOS) nextTicks срабатывает перед запуском этого скрипта в любом случае. (узел v10, v14.14.0, v15.5.1)   -  person Kaiido    schedule 14.06.2021
comment
Я на машине с Windows 10. Выполните его в VS Code с помощью: node script.js   -  person Byte    schedule 14.06.2021
comment
very weird, even в tio они сначала получают nextTicks (они используют node v11.6.0) У меня нет под рукой компьютера с Windows, не могли бы вы попробовать запустить свой скрипт напрямую из терминала или эквивалентного экземпляра?   -  person Kaiido    schedule 14.06.2021
comment
TIO использует Node Version 11.6.0. Если я запускаю свой скрипт на своем компьютере с той же версией, он работает, как и ожидалось. Возможно, это как-то связано с версией узла. Я также пробовал версию 13.14.0, но на этот раз она выводит тот же результат, что и в моем вопросе.   -  person Byte    schedule 15.06.2021
comment
Очень-очень странно, как я уже сказал, я попробовал версию, которую вы упомянули, на моей машине и не смог воспроизвести... Теперь интересно, может ли это быть как-то ненадежным...   -  person Kaiido    schedule 15.06.2021
comment
Да очень странно. Кажется, здесь нет никого, кто может ответить на этот вопрос. Даже узловые люди..   -  person Byte    schedule 15.06.2021
comment
@Byte Вы можете попробовать открыть отчет об ошибке регрессии с помощью nodejs   -  person Bergi    schedule 15.06.2021