2011-02-15 16 views
11

Saludos,repetición de solicitud de jQuery JSON hasta que la condición se cumple

Estoy tratando de repetir una solicitud JSON en jQuery para comprobar el estado de un trabajo de codificación de vídeo hasta que se complete. El "Procesamiento" se mostraría hasta que el trabajo haya finalizado, momento en el que se mostrará el video.

¿Sería la mejor solución para un bucle comprobar cada x segundos para ver si el "estado" es igual a "terminado"? Si es así, ¿cómo me liberaría de este bucle cuando el trabajo haya terminado?

La respuesta JSON mientras el trabajo está en progreso no será más que "procesamiento", cuando finalice contendrá cosas como el ID del trabajo, el ancho y el alto.

¡Cualquier ayuda sería apreciada, gracias!

ACTUALIZACIÓN

aquí está mi solución final gracias a Félix:

var checkStatus = function() { 
    $.getJSON('json-data.php', function(data) { 
    if (data.status != 'finished') { 
      setTimeout(checkStatus, 2000); 
    } else { 
//Sample code to run when finished 
$("#statusText").text("Job Complete"); 
      $("#dimensions").text(data.width + 'x' + data.height); 
     } 
    }); 
    }; 
checkStatus(); 

Respuesta

12

Un bucle no funcionará como la solicitud de Ajax es asíncrona.

Una forma sería hacer el mismo tipo de llamada recursiva y disparar la función Ajax nuevamente desde la devolución de llamada exitosa (quizás después de un tiempo de espera), si la condición no se cumple.

Algo así como (pseudo código):

function check_condition() { 
    $.getJSON(<url>, function(result) { 
     if(!result.finished) { 
      setTimeout(check_condition, 2000); 
     } 
     // do something else 
    } 
} 
+1

corto y dulce, me gusta! Muchas gracias, editando mi pregunta para incluir lo que se me ocurrió gracias a tu ayuda – NightMICU

1
var checkStatusInterval = 30 * 10000; // 30 seconds 
var checkStatusFunc = function(){ 
    $.getJSON('getMovieStatus', function(data){ 
    if (data.Incompleted){ // or however you check 
     checkStatusTimer = setTimeout(checkStatusFunc, checkStatusInterval); 
    } 
    }); 
}; 
var checkStatusTimer = setTimeout(checkStatusFunc,checkStatusInterval); 

Para detener:

<input type="button" id="stopchecking" value="Stop Checking..." /> 
$('#stopchecking').click(function(e){ 
    clearTimeout(checkStatusTimer); 
}); 
Cuestiones relacionadas