SYNC vs ASYNC: ¿Cuál es la diferencia?
Básicamente se reduce a esto:
console.info('Hello, World!');
doSomething(function handleResult(result) {
console.info('Got result!');
});
console.info('Goodbye cruel world!');
Cuando doSomething
es sincrónico, esto se imprimiría:
Hello, World!
Got result!
Goodbye cruel world!
Por el contrario, si doSomething
es asíncrono , se imprimiría:
Hello, World!
Goodbye cruel world!
Got result!
Debido a que la función doSomething
está haciendo su trabajo de forma asincrónica, regresa antes de que termine su trabajo. Entonces solo obtenemos el resultado después de imprimirGoodbye cruel world!
Si dependemos del resultado de una llamada asíncrona, debemos colocar el código dependiente en la devolución de llamada:
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!');
}
});
Como tal, el solo hecho de que deban suceder 2 o tres cosas en orden no es motivo para hacerlo sincrónicamente (aunque el código de sincronización es más fácil de trabajar para la mayoría de las personas).
¿POR QUÉ USAR XMLHTTPREQUEST SINCRÓNICO?
Hay algunas situaciones en las que necesita el resultado antes de que se complete la función llamada. Considere este escenario:
function lives(name) {
return (name !== 'Elvis');
}
console.info('Elvis ' + (lives('Elvis') ? 'lives!' : 'has left the building...');
Supongamos que no tenemos control sobre el código de llamada (la console.info
línea) y necesitamos cambiar la función lives
para preguntar al servidor ... No hay forma de que podamos hacer una solicitud asíncrona al servidor desde dentro lives
y aún tener nuestra respuesta antes de que se lives
complete. Entonces no sabríamos si regresar true
o false
. La única forma de obtener el resultado antes de que se complete la función es mediante una solicitud sincrónica.
Como se Sami Samhuri
menciona en su respuesta, un escenario muy real en el que puede necesitar una respuesta a la solicitud de su servidor antes de que finalice su función es el onbeforeunload
evento, ya que es la última función de su aplicación que se ejecutará antes de que se cierre la ventana.
NO NECESITO LLAMADAS SINCRONIZADAS, PERO LAS UTILIZO DE CUALQUIER MANERA PORQUE SON MÁS FÁCILES
Por favor no lo hagas. Las llamadas sincrónicas bloquean su navegador y hacen que la aplicación no responda. Pero tienes razón. El código asincrónico es más difícil. Sin embargo, hay una manera de hacer que lidiar con esto sea mucho más fácil. No es tan fácil como sincronizar el código, pero se está acercando: Promise s.
A continuación, se muestra un ejemplo: dos llamadas asincrónicas deben completarse con éxito antes de que se ejecute un tercer segmento de código:
var carRented = rentCar().then(function(car){
gasStation.refuel(car);
});
var hotelBooked = bookHotel().then(function(reservation) {
reservation.confirm();
});
Promise.all([carRented, hotelBooked]).then(function(){
goOnHoliday();
});
Así es como lo implementaría 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.'));
}
});
}
Consulte también: Escriba mejor JavaScript con promesas .