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 doSomethingsta 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.infolinea) e di dover cambiare funzione livesper chiedere al server ... Non c'è modo di fare una richiesta asincrona al server dall'interno livese avere ancora la nostra risposta prima che sia livescompletata. Quindi non sapremmo se tornare trueo false. L'unico modo per ottenere il risultato prima del completamento della funzione è eseguire una richiesta sincrona.
Come Sami Samhurimenzionato 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' onbeforeunloadevento, 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 .