SYNC vs ASYNC: qual è la differenza?
Fondamentalmente si riduce a questo:
console.info('Hello, World!');
doSomething(function handleResult(result) {
console.info('Got result!');
});
console.info('Goodbye cruel world!');
Quando doSomething
è sincrono, verrà stampato:
Hello, World!
Got result!
Goodbye cruel world!
Al contrario, se doSomething
è asincrono , verrà stampato:
Hello, World!
Goodbye cruel world!
Got result!
Poiché la funzione doSomething
sta eseguendo il suo lavoro in modo asincrono, ritorna prima che il suo lavoro sia finito. Quindi otteniamo il risultato solo dopo la stampaGoodbye cruel world!
Se dipendiamo dal risultato di una chiamata asincrona, dobbiamo inserire il codice dipendente nella richiamata:
console.info('Hello, World!');
doSomething(function handleResult(result) {
console.info('Got result!');
if (result === 'good') {
console.info('I feel great!');
}
else {
console.info('Goodbye cruel world!');
}
});
In quanto tale, il fatto che due o tre cose debbano accadere non è un motivo per farle in modo sincrono (sebbene il codice di sincronizzazione sia più facile con cui lavorare per la maggior parte delle persone).
PERCHÉ USARE XMLHTTPREQUEST SINCRONO?
Ci sono alcune situazioni in cui è necessario il risultato prima che la funzione chiamata venga completata. Considera questo scenario:
function lives(name) {
return (name !== 'Elvis');
}
console.info('Elvis ' + (lives('Elvis') ? 'lives!' : 'has left the building...');
Supponiamo di non avere alcun controllo sul codice chiamante (la console.info
linea) e di dover cambiare funzione lives
per chiedere al server ... Non c'è modo di fare una richiesta asincrona al server dall'interno lives
e avere ancora la nostra risposta prima che sia lives
completata. Quindi non sapremmo se tornare true
o false
. L'unico modo per ottenere il risultato prima del completamento della funzione è eseguire una richiesta sincrona.
Come Sami Samhuri
menzionato nella sua risposta, uno scenario molto reale in cui potresti aver bisogno di una risposta alla tua richiesta del server prima che la tua funzione termini è l' onbeforeunload
evento, poiché è l'ultima funzione della tua app che verrà mai eseguita prima che la finestra venga chiusa.
NON HO BISOGNO DI CHIAMATE SYNCH, MA LE USO COMUNQUE IN QUANTO SONO PIÙ FACILI
Per favore non farlo. Le chiamate sincrone bloccano il browser e fanno sentire l'app non risponde. Ma hai ragione. Il codice asincrono è più difficile. C'è, tuttavia, un modo per renderlo molto più semplice. Non è facile come il codice di sincronizzazione, ma si sta avvicinando: Promise s.
Ecco un esempio: due chiamate asincrone dovrebbero essere completate correttamente prima che possa essere eseguito un terzo segmento di codice:
var carRented = rentCar().then(function(car){
gasStation.refuel(car);
});
var hotelBooked = bookHotel().then(function(reservation) {
reservation.confirm();
});
Promise.all([carRented, hotelBooked]).then(function(){
goOnHoliday();
});
Ecco come implementeresti bookHotel
:
function bookHotel() {
return new Promise(function(resolve, reject){
if (roomsAvailable()) {
var reservation = reserveRoom();
resolve(reservation);
}
else {
reject(new Error('Could not book a reservation. No rooms available.'));
}
});
}
Vedi anche: Scrivi JavaScript migliore con promesse .