L'idée du non-blocage est que les itérations de boucle sont rapides. Ainsi, l'itération pour chaque tick devrait prendre suffisamment de temps pour que setTimeout soit précis avec une précision raisonnable (peut-être <100 ms environ).
En théorie, vous avez raison. Si j'écris une application et bloque la coche, setTimeouts sera retardé. Donc, pour répondre à votre question, qui peut assurer l'exécution de setTimeouts à temps? En écrivant un code non bloquant, vous pouvez contrôler le degré de précision jusqu'à presque n'importe quel degré de précision raisonnable.
Tant que javascript est "mono-thread" en termes d'exécution de code (à l'exclusion des web-workers et autres), cela se produira toujours. La nature à un seul thread est une énorme simplification dans la plupart des cas, mais nécessite l'idiome non bloquant pour réussir.
Essayez ce code soit dans votre navigateur, soit dans node, et vous verrez qu'il n'y a aucune garantie de précision, au contraire, le setTimeout sera très tardif:
var start = Date.now();
// expecting something close to 500
setTimeout(function(){ console.log(Date.now() - start); }, 500);
// fiddle with the number of iterations depending on how quick your machine is
for(var i=0; i<5000000; ++i){}
À moins que l'interpréteur n'optimise la boucle (ce qu'il ne fait pas sur chrome), vous obtiendrez quelque chose dans les milliers. Retirez la boucle et vous verrez que c'est 500 sur le nez ...