2015-04-16 2 views
1

Я проверяю сервер, если работа выполнена. Я не хочу спамить сервер, поэтому я буду использовать setInterval.Javascript jQuery затем в интервале

Я вызываю функцию триггера, и когда задание выполняется на сервере (возможно, 2-3 вызова до его завершения), функция выполняется.

Я знаю, что могу назвать свою финишную функцию в промежутке и решить ее. Но я хотел бы вернуть его, потому что я вызываю функцию триггера из другого js-файла. И если это возможно, я бы хотел с ней справиться.

function trigger() { 
    var response = startInterval(); 
    response.then(function() { 
     //done finishFunction() 
    }); 
} 

function checkServer() { 
    var obj = { test: true } 
    var respons = $.ajax({ 
     url: "MyUrl", 
     data: JSON.stringify({ obj: obj }), 
     type: "POST", 
     contentType: "application/json", 
     dataType: "JSON", 
     cache: false 
    }); 
    return respons; 
} 

function startInterval() { 
    var inProgress = false; 
    var interval = setInterval(function() { 
     if (!inProgress) { 
      inProgress = true; 
      var response = checkServer().then(function (data) { 
       var isDoneInQueue = JSON.parse(data.d); 
       if (isDoneInQueue) { 
        //finishFunction()??? 
        clearInterval(interval); 
        return response; 
       }; 

       inProgress = false; 
      }); 
     } 
    }, 1000); 
} 
+2

Есть ли у вас конкретная проблема с кодом? –

+0

Моя проблема была, когда я вызвал startInterval, мое возвращение не было моим ответом. И я знал, что это потому, что функция прошла, прежде чем он получил мой ответ. И поскольку я сказал, что могу вызвать функцию в «isDoneInQueue». Но ответ ниже решил мою проблему. – thatsIT

ответ

3

Вернуть Deferred объект из функции, и решить ее, когда работа сервера выполняется:

function startInterval() { 
    var result = $.Deferred(); 
    var inProgress = false; 
    var interval = setInterval(function() { 
     if (!inProgress) { 
      inProgress = true; 
      checkServer().then(function (data) { 
       var isDoneInQueue = JSON.parse(data.d); 
       if (isDoneInQueue) { 
        clearInterval(interval); 
        result.resolve(data); 
       }; 
       inProgress = false; 
      }); 
     } 
    }, 1000); 
    return result; 
} 

Что бы вы называете resolve метод с, отправляется на функцию, которую вы используете с then метод:

function trigger() { 
    startInterval().then(function(data) { 
     //done finishFunction() 
    }); 
} 
+0

Спасибо! Мне нравится, когда я узнаю что-то новое! :) – thatsIT

Смежные вопросы