Ho lavorato su alcune astrazioni di setTimeout e setInterval per elaborare grandi insiemi di dati senza bloccare il ciclo degli eventi nel browser.
Su questo, ho scoperto che i browser "bloccano" il numero di millisecondi specificato per un timeout o un intervallo.
Ad esempio, se scrivi setTimeout('do something', 0)
, il browser farà effettivamente setTimeout('do something', 4)
. In altre parole, il browser imporrà da 2 a 10 millisecondi, a seconda del browser e della versione in cui viene eseguito il codice.
Questo può avere un grande impatto sulla quantità di tempo per un callback / promessa di aspettare. Ci sono modi per aggirare questo (per timeout, comunque), come usare postMessage
o MessageChannel
(soluzioni povere, secondo me); possono fornire lo stesso effetto di un timeout mentre hanno effettivamente 0 tempo di attesa.
Perché i browser bloccano timeout e intervalli in questo modo? Non riesco a trovare alcun ragionamento per questo, ufficiale o altro. La mia unica ipotesi è che in qualche modo consente di aggiungere altri compiti allo stack delle chiamate, ma questo non sembra essere un problema con postMessage
per quanto posso dire, quindi oltre a ciò non posso pensare a nessun motivo per cui questo aiuta chiunque.