В Nodejs почему синхронный код выполняется раньше асинхронного? - PullRequest
1 голос
/ 12 марта 2020

У меня есть этот код:

console.log('1');
process.nextTick(() => console.log('inside nextTick'));
setImmediate(()=> console.log('inside setImmediate'));
console.log("2");
for(var i=0;i<1 ; i++) {
    console.log("inside for loop");
}

И вывод:

1
2
inside for loop
inside nextTick
inside setImmediate

Пожалуйста, объясните, почему это происходит. Даже если я написал console.log("2"); и for loop после process.nextTick и setImmediate, почему они выполняются перед ними?

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Так работает асинхронный код в JavaScript. Когда вы планируете асинхронный код, он добавляется в очередь событий. Это обрабатывается основным событием l oop, которое получает управление только при возврате синхронного кода. Таким образом, запускается весь синхронный код, который регистрирует все эти сообщения, а затем возвращается к главному событию l oop, которое вызывает все асинхронные задачи.

0 голосов
/ 12 марта 2020

Асинхронное поведение, если у нас есть две строки кода Строка-1, за которыми следует Строка-2. Строка-1 - это трудоемкая инструкция. Поэтому Line-1 начинает выполнять свою инструкцию в фоновом режиме (как процесс-демон), позволяя Line-2 начать выполнение без необходимости ждать, пока Line-1 завершит работу sh. Нам нужно такое поведение, когда дела идут медленно. Синхронное выполнение кода может показаться простым, но может быть медленным. Такие задачи, как обработка изображений, могут быть медленными, файловые операции могут быть очень медленными, выполнение сетевых запросов и ожидание ответа определенно медленными, а выполнение огромных вычислений, таких как итерация свыше 100 миллионов для -1 oop, несколько медленное. Поэтому такие медленные вещи в стеке вызовов приводят к «блокированию». Когда стек вызовов заблокирован, браузер предотвращает выполнение прерываний пользователя и других операторов кода до тех пор, пока оператор блокировки не будет выполнен и стек вызовов не будет освобожден. Следовательно, асинхронные обратные вызовы используются для обработки таких ситуаций.

ex:
console.log("Hello");
setTimeout(function(){ console.log("Susi");},2000);
console.log("Iam");

o/p: Hello, Iam susi.

В вашем примере сначала будут напечатаны операторы консоли, потому что process.next будет выполняться на следующей итерации события l oop, а затем setimmediate. благодаря этому вы получаете вывод, как показано ниже.

1
2
inside for loop
inside nextTick
inside setImmediate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...