0

Tengo un problema de ejecución asíncrona, necesito esperar a que una función termine de ejecutarse (es una función que ejecuta un ajax) para que lo que sigue funcione correctamente y tras probar y probar, no encuentro forma que me salga.

Vi que muchos sugieren usar callbacks, deferred, etc, pero la verdad es que no encontré forma de hacerlo.

Lo que necesito es que para ejecutar el if primero termine de contar:

contar();
if (totalpages < actualpage) {
  actualpage = totalpages;
  desde = (showNumber * actualpage) - showNumber;
  $("#contador #actual").html(actualpage);
}

Intenté meter el if dentro de las acciones a ejecutar cuando termine el ajax con algo similar a esto

$.get("paginaqcuenta.php").done( if..... )

Pero no funcionó.

¿Cómo puedo resolver esta situación?

Edito porque me voy acercando... gracias a la sugerencia de Jhoubert Rincon logre que el bloque del if espere al ajax, ahora lo que me falta es que el cargar posterior espere al bloque del if!

Probé lo siguiente y no funciono:

contar();
$.get("../calcPages.php").done(function(data){
    if (totalpages < actualpage) {
      actualpage = totalpages;
      desde = (showNumber * actualpage) - showNumber;
      $("#contador #actual").html(actualpage);
   }
}, cargar());

Probé lo siguiente y si funciona, aunque no creo sea la forma mas eficiente de hacerlo, y por ahí no funcionaria con una conexión mas lenta, por ej.

 contar();
 $.get("../calcPages.php").done(function(data){
    if (totalpages < actualpage) {
      actualpage = totalpages;
      desde = (showNumber * actualpage) - showNumber;
      $("#contador #actual").html(actualpage);
    }
 });
 setTimeout(function(){ 
    cargar(); 
 }, 800);

¿Alguno estaría viendo la solución?

Leandro
  • 41
  • 5
  • Creo que debes usar una funcion dentro del paranetro del done: $.get("paginaqcuenta.php").done( function(data){if....} ) – Jhoubert Rincon Dec 31 '18 at 16:05
  • Muchas gracias! me estoy acercando... lo que me dijiste parece funcionar para esperar el ajax, ahora el desafió esta en que el cargar posterior espere al bloque del if! – Leandro Dec 31 '18 at 16:35
  • si no querés que el código quede medio spaghetti, con callbacks es la forma de manejarlo, el cómo implementarlo lo descubris preguntandote: qué hace `contar();` ? de qué depende? cómo modifica `totalpages` y `actualpage`? que hace `cargar()`? de qué depende? – alo Malbarez Dec 31 '18 at 17:04
  • Probaste usar promesas? – amblador Dec 31 '18 at 17:41
  • Gracias gente! respecto a las callbacks, fue lo primero que mire y trate de seguir el ejemplo de Matt Way en este post https://stackoverflow.com/questions/21518381/proper-way-to-wait-for-one-function-to-finish-before-continuing pero la verdad no pude hacerlo funcionar tampoco... intente hacer un juego con timeouts a ver si una me esperaba a la otra, y siempre se ejecutaban sin esperarse... – Leandro Dec 31 '18 at 21:28
  • respecto a las promesas, me estoy interiorizando con este otro aporte https://es.stackoverflow.com/questions/64265/qu%C3%A9-es-una-promesa-en-javascript , pero tampoco logro entenderlo del todo... cuando veo cosas como `if (/* todo está bien */) { resolve("Exito"); }` no se que debería poner en "todo esta bien", si resolve es una función, si la función va dentro de "éxito", soy bastante nuevo y me generan un mar de dudas estos ejemplos sobre todo cuando no tienen un "run snipet" que me permita reemplazar términos para descubrir lo que pasa con ese juego. – Leandro Dec 31 '18 at 21:32
  • Podrías indicar que la llamada Ajax no fuese asíncrona, así te aseguras de que el código posterior se va a realizar cuando la llamada Ajax ya haya finalizado. – snucka Jan 02 '19 at 07:21

0 Answers0