Promessa vs setTimeout

L’ho osservato nel seguente codice:

setTimeout(function(){console.log('setTimeout')}); Promise.resolve(1).then(function(){console.log('promise resolve')}) 

Indipendentemente dal numero di volte in cui lo eseguo, il callback della promise viene sempre registrato prima del setTimeout.

La mia comprensione è che entrambi i callback sono programmati per essere eseguiti al prossimo tick, e non capisco davvero cosa sta succedendo che fa sì che la promise prenda sempre la precedenza sul timeout.

Risposta breve Le promesse hanno una priorità migliore rispetto alla funzione di callback setTimeout nello stack del ciclo di eventi (o come la conosco).

Risposta lunga guarda questo video. Molto utile. Spero che questo ti aiuti.

https://www.youtube.com/watch?v=8aGhZQkoFbQ

Grazie a @MickJuice per il video nuovo e aggiornato per il ciclo degli eventi.

https://www.youtube.com/watch?v=cCOL7MC4Pl0

setTimeout() ha un ritardo minimo di 4ms , quindi anche se non hai specificato un ritardo nel tuo codice, il timeout sarà comunque ritardato di almeno 4ms. La tua promise .then() viene chiamata nel frattempo.

Promise.resolve pianificare una microtask e il setTimeout pianifica una macrotask. E i microtasks vengono eseguiti prima di eseguire il prossimo macrotask.

I timeout e le promesse hanno scopi diversi.

setTimeout ritarda l’esecuzione del blocco di codice di una durata specifica. Le promesse sono un’interfaccia per consentire l’esecuzione asincrona del codice.

Una promise consente al codice di continuare l’esecuzione mentre si attende il completamento di un’altra azione. Di solito questa è una chiamata di rete. Quindi qualsiasi cosa nella tua chiamata then() verrà eseguita una volta che la chiamata di rete (o qualsiasi altra cosa che la promise è in attesa) sarà completata. La differenza di tempo tra l’inizio della promise e la risoluzione della promise dipende interamente da ciò che la promise è in esecuzione e può cambiare ad ogni esecuzione.

Il motivo per cui la promise è in esecuzione prima del timeout è che la promise non è in realtà in attesa di qualcosa, quindi è stata risolta immediatamente.