Подтвердить что ты не робот

Повторите запрос JQuery JSON до тех пор, пока не будет выполнено условие

Привет,

Я пытаюсь повторить запрос JSON в jQuery, чтобы проверить статус задания кодирования видео до его завершения. "Обработка" будет отображаться до завершения задания, после чего будет отображаться видео.

Будет ли цикл, проверяющий каждые х секунд, чтобы убедиться, что "статус" равен "завершен", будет лучшим решением для этого? Если да, то как я освобожусь от этого цикла, когда работа будет завершена?

Ответ JSON во время выполнения задания будет не чем иным, как "обработкой", когда он будет завершен, он будет содержать такие вещи, как идентификатор задания, ширину и высоту.

Любая помощь будет оценена, спасибо!

UPDATE

Вот мое окончательное решение благодаря Феликс:

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();
4b9b3361

Ответ 1

Цикл не будет работать, поскольку запрос Ajax является асинхронным.

Один из способов - сделать такой же рекурсивный вызов и снова активировать функцию Ajax из обратного вызова успеха (возможно, после некоторого таймаута), если условие не выполнено.

Что-то вроде (псевдокод):

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

Ответ 2

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 );

Чтобы остановить:

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