Supponiamo che io abbia questo codice
function y(resolve, reject) { console.log("Result"); resolve(); } var promise = new Promise(y);
Quello che voglio sapere è se la funzione y
sarà eseguita in modo asincrono o meno.
Dipende dall’implementazione della promise. Se controlliamo le specifiche . Puoi trovare le specifiche finali qui – poiché questa risposta è stata originariamente scritta, è stata finalizzata.
Ecco l’estratto pertinente (puoi trovare la fonte originale qui )
Lo standard ES6 indica che l’adempimento di una promise è sempre asincrono (vedere la sezione 25.4.5.3, Promise.prototype.then
e la relativa sezione 25.4.5.3.1, PerformPromiseThen
). Ho inserito il materiale pertinente di seguito.
TLDR : la funzione passata alla promise viene eseguita in modo sincrono, ma le chiamate successive vengono sempre eseguite in modo asincrono.
L’altra risposta lo dimostra , ma lasciatemi parlare del ragionamento:
Il callback del costruttore promise (come specificato nella specifica ES6 o nell’impianto delle librerie delle specifiche del costruttore) verrà sempre eseguito in modo sincrono – questo è per estrarre una forma differita (forma più vecchia di promise) da esso nel caso in cui sia necessario avere accesso per richiamare la resolve
:
var r; var p new Promise(function(resolve, reject){ r = resolve; }); // use r here, for example arr.push(r);
then
callback then
sarà sempre eseguito in modo asincrono, praticamente tutte le principali implementazioni di promise (nativo, bluebird, $ q, Q, quando, rsvp, promise, jQuery (a partire dalla 3.0) ecc.) e le promesse native implementano (o implementano un superset di, con più vincoli) Promises / A + .
Questo è esattamente il motivo per cui Promises / A + è stato creato da Promises / A. Le garanzie asincrone verranno preservate e Zalgo non verrà rilasciato. (Vedi anche questo post ).
Il fatto che ciò accada (garanzia asincrona) è completamente intenzionale e impedisce triggersmente le condizioni di gara . Il codice dentro e fuori di then
verrà sempre eseguito nello stesso ordine.
Ecco la citazione pertinente:
onFulfilled
oonRejected
non devono essere chiamati fino a quando lo stack del contesto di esecuzione contiene solo il codice della piattaforma. [3.1].