JS: Порядок исполнения

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"

здесь что-то не так?

Пожалуйста, не забудьте просмотреть свой пост после того, как разместите его: весь ваш текст был просто гигантской цитатой. Это не как ты пишешь хороший вопрос

Mike 'Pomax' Kamermans 15.12.2018 02:54

Теперь, как собственно комментарий, связанный с кодом: setTimeout(...., 0) не существует. Для Nodejs существует process.nextTick, если вам нужна более управляемая версия «ASAP», но нельзя полагаться на функцию по определениюsetTimeout, чтобы сработать, когда вы говорите, что это необходимо. Он имеет минимальную задержку 3 ~ 4 миллисекунды (благодаря очень глупым решениям давным-давно, когда разные браузеры делали разные вещи с таймаутами) и гарантированно срабатывает только после по крайней мере, столько миллисекунд. Это могло быть дольше, и это совершенно правильное поведение.

Mike 'Pomax' Kamermans 15.12.2018 02:56

Чего вы пытаетесь достичь?

Kubwimana Adrien 15.12.2018 02:56
setImmediate() не является стандартным и не входит в стандартную дорожку.
Barmar 15.12.2018 03:02

Хорошее чтение: jakearchibald.com/2015/tasks-microtasks-queues-and-schedules

Andrew Li 15.12.2018 03:04

@Barmar setImmediate() - это документированная часть Node.js.

Mark 15.12.2018 03:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В Javascript выполнение происходит асинхронно. Цикл событий принимает команды и запускает их. Это так разработано, и вы можете прочитать это здесь

Если вам случайно нужен конкретный порядок, вы можете использовать обратные вызовы, обещания или async / await. Если вы используете Async / Await, вам необходимо указать эту конкретную функцию как Async, и вы сможете управлять внутренним потоком этой функции синхронно, но функция внешней программы по-прежнему будет работать асинхронно.

Я надеюсь, что это не слишком запутанно, поэтому позвольте мне повторить, все асинхронно, но вы можете сделать небольшую синхронизацию части (функции), которая будет следовать пошаговому порядку выполнения, но по сравнению с другими функциями и программами ваша функция может быть выполнена, чтобы это не было фиксированный.

спасибо за ваш ответ. осторожно подумайте об этом как об асинхронной проблеме

Perhaps 15.12.2018 03:07

Очереди заданий, микрозадачи и другие очереди задач делать имеют некоторый порядок, определенный механизмом и спецификацией IIRC ECMAScript ...

Andrew Li 15.12.2018 03:08

Согласен, просто объяснил здесь небольшие детали, а остальное - по ссылке MDN, которой я поделился

Sumer 15.12.2018 03:43

Первые несколько событий с обещанием и синхронным кодом нормальны и, вероятно, соответствуют вашим ожиданиям. (Код в определении обещания запускается синхронно, что сначала кажется удивительным.) Разница между порядком setTimout() с нулевой задержкой и setImmediate() недетерминирована. Это описано здесь:

Цикл событий Node.js

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');  
});

Другие вопросы по теме