Tengo el siguiente botón en el que hago clic mediante programación.

document.getElementById("generateButton").click();

Este botón crea una tabla y carga los datos de la base de datos.

Luego tengo opciones para ordenar la tabla que, si se especifica en la url, la tabla se ordenará una vez cargada.

if(COL_ONE == "true")
            sortTable("COL_ONE");

Mi problema es que la tabla tarda unos 3 segundos en cargarse. Por lo tanto, la instrucción if donde ocurre la ordenación termina ejecutándose antes de crear la tabla. Por lo tanto, la clasificación no se produce. Si coloco un punto de interrupción en la instrucción if y detengo la ejecución en la instrucción if, y espero hasta que vea la carga de la tabla, luego ejecuto la instrucción if (a través del depurador), entonces mi clasificación funciona. Por lo tanto, el código está funcionando, es solo una cuestión de encontrar una manera de detenerse hasta que se cargue la tabla. ¿Hay alguna forma de que pueda hacer esto, donde hasta que se cargue la tabla, luego ejecute la siguiente instrucción if, estoy haciendo esto al cargar la página?

0
user3767481 29 ago. 2014 a las 21:20

3 respuestas

La mejor respuesta

Puede hacer uso de la devolución de llamada en este caso

function tableLoaded(callback) {
   //Code to load the table
   callback();
}

En su función principal

tableLoaded(function(){
   //have your if statement
   if(COL_ONE == "true")
      sortTable("COL_ONE");
});
0
Derek 朕會功夫 29 ago. 2014 a las 17:32

Debe poner la funcionalidad de clasificación en una devolución de llamada y configurarla para que se llame después de que se carguen los datos. Me di cuenta de que podría estar cargando los datos en las tablas de forma asincrónica, es decir, cargando datos en una función de devolución de llamada, lo que probablemente sea la razón por la que la función de clasificación se activa antes de la carga ... no haga eso, haga que la clasificación se ejecute justo después de la llamada la función para cargar datos ... Quizás sería mejor si me dijeras cómo estás cargando los datos para que pueda decirte exactamente cuándo y dónde colocar la función de devolución de llamada con la funcionalidad de clasificación. Por ejemplo, si está utilizando soporte de terceros para cargar los datos, probablemente debería intentar encontrar en la API una llamada a la función para cargar datos que también acepte una devolución de llamada o un controlador de finalización. Para la devolución de llamada, debe pasar su funcionalidad de clasificación en forma de una función anónima. ¡¡Espero que esto ayude!!

0
Lakmal Caldera 29 ago. 2014 a las 17:59

Por favor, publique el código de base de datos relevante.

Sin embargo, solo puedo adivinar que se parece a esto:

document.getElementById("generateButton").addEventListener('click', function() {
    var xmlHttp = new XMLHttpRequest(); 
    xmlHttp.onreadystatechange = function() {
      if ( xmlHttp.readyState == 4 && xmlHttp.status == 200 ) {
        updateTable(xmlHttp.responseText);
      }
    };
    xmlHttp.open("GET", '/get-info-from-db', true);
    xmlHttp.send();
});

En cuyo caso, es un cambio simple:

document.getElementById("generateButton").addEventListener('click', function() {
    var xmlHttp = new XMLHttpRequest(); 
    xmlHttp.onreadystatechange = function() {
      if ( xmlHttp.readyState == 4 && xmlHttp.status == 200 ) {
        updateTable(xmlHttp.responseText);
        if(COL_ONE == "true")
          sortTable("COL_ONE");
      }
    };
    xmlHttp.open("GET", '/get-info-from-db', true);
    xmlHttp.send();
});
0
Frambot 29 ago. 2014 a las 17:25