Ben şu kod:Neden setTimeout çıkışları numaraları değil eklendi
function wait(ms) {
var start = +(new Date());
while (new Date() - start < ms);
}
(function() {
setTimeout(function(){console.log(2)}, 1000);
setTimeout(function(){console.log(3)}, 0);
setTimeout(function(){console.log(4)}, 0);
wait(2000); //!!! blocking events processing here
})();
O çıkarır:
3
4
2
Sonra zaman setTimeout
event queue fonksiyonu ekler olduğunu okumuştum ve ettik Bu işlev zincirdeki ilkdir, belirtilen sürenin geçip geçmediğini kontrol eder, değilse, yürütmeyi erteler. Bu mantık altında yukarıdaki kodun çıkmasını bekledim: wait()
işlevi, wait()
işlevinin, olay zincirleme işlemini engellediğinden ve bir çağrı yığını tamamlandığında ve bir tarayıcıda, setTimeout aracılığıyla eklenen işlevleri işlemek için zamana sahip olduğundan, üç işlev de, eklenen ve eklenen sıraya yerleştirilir. 1000, ilk işlev için halihazırda geçti, böylece bir tarayıcı onu alabilir ve çalıştırabilir, ancak ikinci ve üçüncü eklenen işlevleri bekler. Niye ya? Mantığımdaki hata nerede?
tek şey 'setTimeout' garantileri geri aramaları * olarak azından gelecekte kaç milisaniye * istendiği gibi çalıştırılacaktır olmasıdır. Kimse belli bir emri garanti etmeyecek bir şey demedi. – deceze