setTimeout(function () {
console.info('timeout1')
}, 0);
setImmediate(function () {
console.info('immediate1')
});
new Promise(function (resolve, reject) {
console.info('promise1');
resolve()
}).then(function () {
console.info('then1');
setTimeout(function () {
console.info('timeout2')
}, 0)
});
console.info('global1');
когда я использую node.js для многократного запуска этого кода выше, я получаю разные результаты; иногда результат
"promise1"-->"global1"-->"then1"-->"timeout1"-->"immediate1"-->"timeout2";
а в других случаях результат
"promise1"-->"global1"-->"then1"-->"timeout1"-->"timeout2"-->"immediate1"
здесь что-то не так?
Теперь, как собственно комментарий, связанный с кодом: setTimeout(...., 0) не существует. Для Nodejs существует process.nextTick, если вам нужна более управляемая версия «ASAP», но нельзя полагаться на функцию по определениюsetTimeout, чтобы сработать, когда вы говорите, что это необходимо. Он имеет минимальную задержку 3 ~ 4 миллисекунды (благодаря очень глупым решениям давным-давно, когда разные браузеры делали разные вещи с таймаутами) и гарантированно срабатывает только после по крайней мере, столько миллисекунд. Это могло быть дольше, и это совершенно правильное поведение.
Чего вы пытаетесь достичь?
setImmediate() не является стандартным и не входит в стандартную дорожку.
Хорошее чтение: jakearchibald.com/2015/tasks-microtasks-queues-and-schedules
@Barmar setImmediate() - это документированная часть Node.js.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В Javascript выполнение происходит асинхронно. Цикл событий принимает команды и запускает их. Это так разработано, и вы можете прочитать это здесь
Если вам случайно нужен конкретный порядок, вы можете использовать обратные вызовы, обещания или async / await. Если вы используете Async / Await, вам необходимо указать эту конкретную функцию как Async, и вы сможете управлять внутренним потоком этой функции синхронно, но функция внешней программы по-прежнему будет работать асинхронно.
Я надеюсь, что это не слишком запутанно, поэтому позвольте мне повторить, все асинхронно, но вы можете сделать небольшую синхронизацию части (функции), которая будет следовать пошаговому порядку выполнения, но по сравнению с другими функциями и программами ваша функция может быть выполнена, чтобы это не было фиксированный.
спасибо за ваш ответ. осторожно подумайте об этом как об асинхронной проблеме
Очереди заданий, микрозадачи и другие очереди задач делать имеют некоторый порядок, определенный механизмом и спецификацией IIRC ECMAScript ...
Согласен, просто объяснил здесь небольшие детали, а остальное - по ссылке MDN, которой я поделился
Первые несколько событий с обещанием и синхронным кодом нормальны и, вероятно, соответствуют вашим ожиданиям. (Код в определении обещания запускается синхронно, что сначала кажется удивительным.) Разница между порядком setTimout() с нулевой задержкой и setImmediate() недетерминирована. Это описано здесь:
For example, if we run the following script which is not within an I/O cycle (i.e. the main module), the order in which the two timers are executed is non-deterministic, as it is bound by the performance of the process:
// timeout_vs_immediate.js setTimeout(() => { console.info('timeout'); }, 0); setImmediate(() => { console.info('immediate'); });
Пожалуйста, не забудьте просмотреть свой пост после того, как разместите его: весь ваш текст был просто гигантской цитатой. Это не как ты пишешь хороший вопрос