почему setTimeout ждет, однако это занимает 0 мс? - PullRequest
1 голос
/ 03 мая 2020
setTimeout(function () {
console.log("m");
} , 0)
console.log('s');

почему этот фрагмент печати "s" перед "m", а setTimeout занимает 0 мс ожидания?

Ответы [ 4 ]

1 голос
/ 03 мая 2020

Когда вы создаете обещание, или вызываете асинхронную функцию c, или устанавливаете тайм-аут на 0 миллисекунд, функция немедленно ставится в очередь в Javascript событие l oop. По сути, функция добавляется в очередь вызываемых функций, и когда интерпретатору javascript нечего делать, он начинает вызывать эти функции. Итак, когда вы устанавливаете тайм-аут на 0 миллисекунд, он ставит в очередь console.log("m"), затем вызывает console.log("s"), тогда ему нечего делать, поэтому он заканчивает очередь console.log("m"), поэтому он вышел из строя.

1 голос
/ 03 мая 2020

Браузер или node.js всегда запускают однопоточное событие l oop для запуска вашего кода. При первом запуске он всегда запускает ваш синхронный код, но также может ставить в очередь асинхронные события, которые будут вызываться позже. Вот почему мы вызываем здесь функцию callback function, она будет вызвана позже.

setTimeout - это микрозадача.

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

Также побочный эффект: 0 ms просто означает, что он будет минимально ждать 0 ms не точно 0

0 голосов
/ 03 мая 2020

потому что JS код идет по порядку один за другим. Когда вы указываете, что setTimeout равен 0, все еще ждет, в C ++ lang это будет что-то вроде 0,000000245ms, и JS часто запускается в браузере C ++ / C.

попробуйте этот простой пример

for (let x = 0; x < 500; x++) {
  setTimeout(() => console.log(x), 0);
}
console.log('hello');
0 голосов
/ 03 мая 2020

это просто потому, что JS является однопоточным и событие l oop работает таким образом. setTimeout написал таким образом, что он отправит вам функцию или все, что вы хотите сделать в очереди обратного вызова. и затем переходите к следующей строке, после выполнения следующей строки она не будет запускать вашу часть setTimeout, или, другими словами, она не будет обрабатывать часть setTimeout, пока стек не будет пустым.

, так что это ваш код, и он будет выполняться следующим образом.

 setTimeout(function () {
    console.log("m");
 } , 0)
 console.log('s');
  1. первая строка будет выполнена, и она отправит внутреннюю часть setTimeout в очередь обратного вызова и переместится на вторую строку.
  2. во время выполнения 2-й строки часть setTimeout будет ожидать, пока стек не заполнится, и как только вторая строка завершит выполнение,
  3. будет выполнена часть setTimeout,

возможно, это сбивает с толку по словам, давайте посмотрим на это в действии. Бьюсь об заклад, вы не можете получить лучший пример, чем это, чтобы понять это, это объяснено в лучший способ Филиппа Роберта.

...