SYNC vs ASYNC: Quelle est la différence?
En gros, cela se résume à ceci:
console.info('Hello, World!');
doSomething(function handleResult(result) {
console.info('Got result!');
});
console.info('Goodbye cruel world!');
Quand doSomething
est synchrone cela imprimerait:
Hello, World!
Got result!
Goodbye cruel world!
En revanche, si doSomething
est asynchrone , cela afficherait:
Hello, World!
Goodbye cruel world!
Got result!
Étant donné que la fonction doSomething
effectue son travail de manière asynchrone, elle retourne avant que son travail ne soit terminé. On n'obtient donc le résultat qu'après impressionGoodbye cruel world!
Si nous dépendons du résultat d'un appel asynchrone, nous devons placer le code dépendant dans le rappel:
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!');
}
});
En tant que tel, le simple fait que 2 ou trois choses doivent se produire dans l'ordre n'est pas une raison de les faire de manière synchrone (bien que le code de synchronisation soit plus facile pour la plupart des gens à travailler).
POURQUOI UTILISER SYNCHRONOUS XMLHTTPREQUEST?
Dans certaines situations, vous avez besoin du résultat avant la fin de la fonction appelée. Considérez ce scénario:
function lives(name) {
return (name !== 'Elvis');
}
console.info('Elvis ' + (lives('Elvis') ? 'lives!' : 'has left the building...');
Supposons que nous n'ayons aucun contrôle sur le code appelant (la console.info
ligne) et que nous devions changer de fonction lives
pour demander au serveur ... Il n'y a aucun moyen que nous puissions faire une requête asynchrone au serveur de l'intérieur lives
et avoir toujours notre réponse avant la lives
fin. Nous ne saurions donc pas s'il faut revenir true
ou false
. La seule façon d'obtenir le résultat avant la fin de la fonction est de faire une requête synchrone.
Comme l' Sami Samhuri
indique sa réponse, un scénario très réel dans lequel vous pourriez avoir besoin d'une réponse à votre demande de serveur avant la fin de votre fonction est l' onbeforeunload
événement, car c'est la dernière fonction de votre application qui s'exécutera avant la fermeture de la fenêtre.
JE N'AI PAS BESOIN D'APPELS DE SYNCHRONISATION, MAIS JE LES UTILISE DE TOUTE MANIÈRE COMME ILS SONT PLUS FACILES
Veuillez ne pas le faire. Les appels synchrones verrouillent votre navigateur et font que l'application ne répond pas. Mais tu as raison. Le code async est plus difficile. Il existe cependant un moyen de faciliter le traitement. Pas aussi simple que le code de synchronisation, mais ça se rapproche: promesses .
Voici un exemple: Deux appels asynchrones doivent tous deux se terminer avec succès avant qu'un troisième segment de code puisse s'exécuter:
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();
});
Voici comment vous implémenteriez 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.'));
}
});
}
Voir aussi: Ecrire un meilleur JavaScript avec des promesses .