Prendi questo codice:
requestAnimationFrame(function (timestamp) {
console.log('one', timestamp);
});
requestAnimationFrame(function (timestamp) {
console.log('two', timestamp);
});
// logs:
// "one", 184.6999999834225
// "two", 184.6999999834225
Il timestamp è di millisecondi poiché la pagina è stata caricata. Nota queste due chiamate rAF restituiscono ID diversi che puoi cancellare singolarmente.
Ora facciamo in modo che la prima callback faccia qualcosa di molto costoso:
requestAnimationFrame(function (timestamp) {
console.log('one', timestamp);
// block for 1 second
const endAt = Date.now() + 1000;
while (true) {
if (Date.now() >= endAt) break;
}
});
requestAnimationFrame(function (timestamp) {
console.log('two', timestamp);
});
// LOGS:
// "one", 189.32800000533462
// "two", 189.32800000533462 (this appears one second later)
Sono confuso: il secondo viene eseguito un intero secondo dopo, ma ottiene lo stesso timestamp. Perché non può ottenere un nuovo timestamp, uno corrispondente a quello che il frame di aggiornamento del monitor corrente è ora nel momento in cui viene chiamato?
Se rAF decide in anticipo che il callback deve essere eseguito nello stesso frame di un altro callback, indipendentemente da quanto possa richiedere l'altra callback, il 'frame' sembra un concetto privo di significato che non corrisponde a un callback aggiornamento singolo monitor - quindi qual è il punto?
Sono sicuro che c'è una buona ragione per cui è implementata in questo modo, voglio solo capirlo.