SYNC vs ASYNC: Was ist der Unterschied?
Im Grunde läuft es darauf hinaus:
console.info('Hello, World!');
doSomething(function handleResult(result) {
console.info('Got result!');
});
console.info('Goodbye cruel world!');
Wenn dies synchrondoSomething ist, wird Folgendes gedruckt:
Hello, World!
Got result!
Goodbye cruel world!
Wenn dies dagegen asynchron ist , doSomethingwird Folgendes gedruckt:
Hello, World!
Goodbye cruel world!
Got result!
Da die Funktion doSomethingihre Arbeit asynchron ausführt, kehrt sie zurück, bevor ihre Arbeit erledigt ist. Das Ergebnis erhalten wir also erst nach dem DruckenGoodbye cruel world!
Wenn wir vom Ergebnis eines asynchronen Aufrufs abhängig sind, müssen wir den abhängigen Code in den Rückruf einfügen:
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!');
}
});
Daher ist nur die Tatsache, dass zwei oder drei Dinge in der Reihenfolge geschehen müssen, kein Grund, sie synchron auszuführen (obwohl der Synchronisierungscode für die meisten Menschen einfacher zu handhaben ist).
WARUM SYNCHRONE XMLHTTPREQUEST VERWENDEN?
In einigen Situationen benötigen Sie das Ergebnis, bevor die aufgerufene Funktion abgeschlossen ist. Stellen Sie sich dieses Szenario vor:
function lives(name) {
return (name !== 'Elvis');
}
console.info('Elvis ' + (lives('Elvis') ? 'lives!' : 'has left the building...');
Angenommen, wir haben keine Kontrolle über den aufrufenden Code (die console.infoLeitung) und müssen die Funktion ändern lives, um den Server zu fragen ... Wir können auf keinen Fall eine asynchrone Anforderung an den Server von innen ausführen livesund haben unsere Antwort noch vor livesAbschluss. Wir würden also nicht wissen, ob wir zurückkehren sollen trueoder nicht false. Die einzige Möglichkeit, das Ergebnis vor Abschluss der Funktion zu erhalten, besteht in einer synchronen Anforderung.
Wie Sami Samhuriin seiner Antwort erwähnt, ist das onbeforeunloadEreignis ein sehr reales Szenario, in dem Sie möglicherweise eine Antwort auf Ihre Serveranforderung benötigen, bevor Ihre Funktion beendet wird , da es die letzte Funktion Ihrer App ist, die jemals ausgeführt wird, bevor das Fenster geschlossen wird.
ICH BRAUCHE KEINE SYNCH CALLS, ABER ICH BENUTZE SIE JEDERZEIT, WIE SIE EINFACHER SIND
Bitte nicht. Synchrone Anrufe sperren Ihren Browser und sorgen dafür, dass die App nicht mehr reagiert. Aber Sie haben Recht. Async-Code ist schwieriger. Es gibt jedoch eine Möglichkeit, den Umgang damit viel einfacher zu gestalten. Nicht so einfach wie Synchronisierungscode, aber es kommt näher: Versprechen s.
Hier ein Beispiel: Zwei asynchrone Aufrufe sollten beide erfolgreich abgeschlossen werden, bevor ein drittes Codesegment ausgeführt werden kann:
var carRented = rentCar().then(function(car){
gasStation.refuel(car);
});
var hotelBooked = bookHotel().then(function(reservation) {
reservation.confirm();
});
Promise.all([carRented, hotelBooked]).then(function(){
// At this point our car is rented and our hotel booked.
goOnHoliday();
});
So würden Sie implementieren 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.'));
}
});
}
Siehe auch: Besseres JavaScript mit Versprechen schreiben .