JavaScript Callback promesso esegue Asynchronosuly

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 )

  1. Lasciate che il completamento sia Call (esecutore, indefinito, «resolvingFunctions. [[Resolve]], resolvingFunctions. [[Reject]]»).
  2. Se il completamento è un completamento brusco, allora
    • Lascia che lo stato sia Call (resolvingFunctions. [[Reject]], undefined, «completion. [[Value]]»).
    • ReturnIfAbrupt (stato).

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.

PerformPromiseThen

  1. Altrimenti, se il valore dello slot interno [[PromiseState]] della promise è “soddisfatto”,
    • Lascia che il valore sia il valore dello slot interno [[PromiseResult]] di promise.
    • Esegui EnqueueJob (“PromiseJobs”, PromiseReactionJob, «fulfillReaction, value»).
  2. Altrimenti, se il valore dello slot interno [[PromiseState]] della promise è “rifiutato”,
    • Lascia che la ragione sia il valore dello slot interno [[PromiseResult]] di promise.
    • Eseguire EnqueueJob (“PromiseJobs”, PromiseReactionJob, «rejectReaction, reason»).

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:

Prometti costruttore

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 o onRejected non devono essere chiamati fino a quando lo stack del contesto di esecuzione contiene solo il codice della piattaforma. [3.1].