console.time("Time");
var i=0;
setTimeout(function(){console.log("Timeout...")},500);

while(true){
  if(i==1000000000){
    console.timeEnd("Time");
    console.log("whileloop breaking...");
    break;
  }
  else{i++;}
}

В этом коде я пытаюсь напечатать Timeout в консоли через 0,5 секунды, и есть цикл while, который завершается примерно через 2 секунды, который я показываю путем регистрации времени, проведенного. Я ожидал, что Тайм-аут будет напечатан первым, поскольку он завершится через 0,5 секунды, а прерывание цикла должно будет печататься, что занимает больше времени , но сначала он печатает whileloop break , а затем идет на время ожидания ... любой может объяснить трассировку стека или поток этого кода.

0
Abhishek 29 Авг 2017 в 11:43

3 ответа

Лучший ответ

Вот лучший способ визуализировать, что происходит, когда вы запускаете над кодом:

http://latentflip.com/loupe/?code=Y29uc29sZS50aW1lKCJUaW1lIik7DQp2YXIgaT0wOw0Kc2V0VGltZW91dChmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJUaW1lb3V0Li4uIil9LDUwMCk7DQoNCndoaWxlKHRydWUpew0KICBpZihpPT0xMDAwMDAwMDAwKXsNCiAgICBjb25zb2xlLnRpbWVFbmQoIlRpbWUiKTsNCiAgICBjb25zb2xlLmxvZygid2hpbGVsb29wIGJyZWFraW5nLi4uIik7DQogICAgYnJlYWs7DQogIH0NCiAgZWxzZXtpKys7fQ0KfQ0KIA%3D%3D!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D

Давайте разберемся, что происходит в коде

    console.time("Time");
        var i=0;
        //here a callback is registered and should be called when timer expires
        setTimeout(function(){console.log("Timeout...")},500);

        //since settimeout is async in nature, main thread continues 
    //to execute new line of code i.e. while loop
        // After 500 ms when timer expires, it puts the callback in event queue, 
    // the callback will be executed as soon as it sees the main thread free, but since 
//while loop is running on main thread for 2sec, the main thread will be free //only after 2 sec (or while loop) finishes.
        while(true){
          if(i==1000000000){
            console.timeEnd("Time");
            console.log("whileloop breaking...");
            break;
          }
          else{i++;}
        }
        // as there is no code to be executed now, main thread takes new task from 
        // event Queue, in this case the new task is callback from settimeout.

Я надеюсь, что это поможет вам понять немного о времени ожидания

0
Nemani 29 Авг 2017 в 09:09

Во-первых, я не очень хорошо говорю по-английски. но я хочу помочь тебе

Браузер представляет собой однопоточную очередь событий. Если первая задача выполняется, то все события будут проведены

Посмотри на свой код

Вы объявили setTimeout. Однако этот setTimeout выполняется через 0.5 с.

Но вы не можете выполнить setTimeout через 0,5 секунды, потому что whileloop имеет только один поток в однопоточном браузере

Я подготовил ссылку для вас

Борьба с очередью событий браузера

Модель параллелизма и Event Loop

2
L.Wonbae 30 Авг 2017 в 02:10

Как прокомментировал @RobG: «Javascript является однопоточным. Тайм-аут не может работать до тех пор, пока не завершится цикл while».

Но если вы хотите сначала напечатать в своем коде время ожидания , а затем разрыв строки , попробуйте это:

console.time("Time");
var i=0;
//setTimeout(function(){console.log("Timeout...")},500);
setTimeout(console.log("Timeout..."),500);

while(true){
  if(i==1000000000){
    console.timeEnd("Time");
    console.log("whileloop breaking...");
    break;
  }
  else{i++;}
}

Я только что удалил function(){} из setTimeout ..

0
Sachin 29 Авг 2017 в 08:54