L'unico problema con le promesse è che IE non le supporta. Edge fa, ma c'è un sacco di IE 10 e 11 là fuori: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise (compatibilità in fondo)
Quindi, JavaScript è a thread singolo. Se non si effettua una chiamata asincrona, si comporterà in modo prevedibile. Il thread JavaScript principale eseguirà una funzione completamente prima di eseguire quella successiva, nell'ordine in cui compaiono nel codice. Garantire l'ordine delle funzioni sincrone è banale: ogni funzione verrà eseguita completamente nell'ordine in cui è stata chiamata.
Pensa alla funzione sincrona come a un'unità atomica di lavoro . Il thread JavaScript principale lo eseguirà completamente, nell'ordine in cui le istruzioni compaiono nel codice.
Ma, lancia la chiamata asincrona, come nella seguente situazione:
showLoadingDiv(); // function 1
makeAjaxCall(); // function 2 - contains async ajax call
hideLoadingDiv(); // function 3
Questo non fa quello che vuoi . Esegue istantaneamente la funzione 1, la funzione 2 e la funzione 3. Il caricamento di div lampeggia ed è andato, mentre la chiamata ajax non è quasi completa, anche se makeAjaxCall()
è tornata. LA COMPLICAZIONE è che makeAjaxCall()
ha suddiviso il suo lavoro in blocchi che vengono fatti avanzare gradualmente a ogni giro del thread JavaScript principale - si sta comportando in modo asincrono. Ma quello stesso thread principale, durante uno spin / run, ha eseguito le porzioni sincrone in modo rapido e prevedibile.
Quindi, il modo in cui l'ho gestita : come ho detto, la funzione è l'unità atomica di lavoro. Ho combinato il codice della funzione 1 e 2 - Ho inserito il codice della funzione 1 nella funzione 2, prima della chiamata asincrona. Mi sono liberato della funzione 1. Tutto fino alla chiamata asincrona inclusa, compresa, viene eseguita in modo prevedibile, in ordine.
ALLORA, al termine della chiamata asincrona, dopo diversi giri del thread JavaScript principale, viene chiamata la funzione 3. Ciò garantisce l'ordine . Ad esempio, con ajax, il gestore eventi onreadystatechange viene chiamato più volte. Quando segnala che è stato completato, chiama l'ultima funzione desiderata.
Sono d'accordo che è più disordinato. Mi piace che il codice sia simmetrico, mi piace che le funzioni facciano una cosa (o vicino ad essa) e non mi piace che la chiamata ajax sia in alcun modo responsabile del display (creando una dipendenza dal chiamante). MA, con una chiamata asincrona incorporata in una funzione sincrona, è necessario scendere a compromessi per garantire l'ordine di esecuzione. E devo codificare per IE 10, quindi nessuna promessa.
Riepilogo : per le chiamate sincrone, garantire l'ordine è banale. Ogni funzione viene eseguita completamente nell'ordine in cui è stata chiamata. Per una funzione con una chiamata asincrona, l'unico modo per garantire l'ordine è monitorare il completamento della chiamata asincrona e chiamare la terza funzione quando viene rilevato quello stato.
Per una discussione sui thread JavaScript, consultare: https://medium.com/@francesco_rizzi/javascript-main-thread-dissected-43c85fce7e23 e https://developer.mozilla.org/en-US/docs/Web/JavaScript/ EventLoop
Inoltre, un'altra domanda simile e molto apprezzata su questo argomento: come devo chiamare 3 funzioni per eseguirle una dopo l'altra?
firstFunction
esattamente ciò che lo rende asincrono? Ad ogni modo - controlla le promesse