Las peticiones Ajax por definición son asíncronas, según MDN:
El término asíncrono se refiere al concepto de que más de una cosa
ocurre al mismo tiempo, o múltiples cosas relacionadas ocurren sin
esperar a que la previa se haya completado.
Es importante no perder de vista esto y considerar que muchas cosas ocurren en una petición Ajax (conexión a la red, recogida de datos, envío de datos, recepción de datos en el servidor, procesamiento de datos, respuesta al cliente, posibles errores, etc) y el orden / momento en que esas cosas ocurren no está pre-establecido.
Por otra parte, cuando hay una petición Ajax el código sigue su curso. Esto es así para que el hilo principal no se bloquee mientras la petición Ajax se completa, produciendo una pésima experiencia de usuario. Por eso, aunque puedes cambiar el comportamiento por defecto de Ajax mediante async: false
no es recomendable hacerlo en ningún caso.
Para hacer lo que quieres y tener una petición Ajax que no bloquee el hilo principal, puedes hacerlo de dos maneras:
Manejar los datos dentro del bloque success
$.ajax({
url: 'assets/js/mqtt/ajax.php',
type: 'POST',
data:{action:action,seleccion:seleccion},
success:function(response){
var resultados = JSON.parse(response);
datosx = resultados.datox;
datosy = resultados.datoy;
console.log(datosx);
console.log(datosy);
},
error:function(error){
console.log(error);
}
});
Definir una función que haga de callback
Creas una nueva función y la llamas desde dentro de success
pasándole en parámetro la respuesta. En este caso es recomendable crear las variables dentro de la función, así pasas un solo parámetro que sería la respuesta:
$.ajax({
url: 'assets/js/mqtt/ajax.php',
type: 'POST',
data:{action:action,seleccion:seleccion},
success:function(response){
handleResponse( JSON.parse(response) );
},
error:function(error){
console.log(error);
}
});
function handleResponse(resultados) {
datosx = resultados.datox;
datosy = resultados.datoy;
console.log(datosx);
console.log(datosy);
}
Aquí, handleResponse()
será invocada sin ninguna duda cuando la petición Ajax haya terminado con éxito.