Как проверить, готова ли / сделана функция JavaScript (jQuery)
Я работаю над учебным планировщиком, который получает свои данные (языковые клавиши, задачи, действия и т. Д.) Из базы данных. Поскольку мне нужна строка JSON, я кодирую ее json_encode
работать с ним в JavaScript. У меня есть другая функция (для ключей, задач, действий и т. Д.), Которая получает эти данные и записывает их в массив.
function get_tasks(start_date,end_date){
maxsubtasks=0;
maxtasks=0;
$.getJSON(json_data+"?t_startdate="+start_date+"&t_enddate="+end_date, function(data) {
tasks=new Array();
$.each(data.tasks, function(i,item){
tasks[i]= new Object();
tasks[i]["t_id"]=item.t_id;
tasks[i]["t_title"]=item.t_title;
tasks[i]["t_content"]=item.t_content;
. . .
if ( i > data.tasks.length) return false;
maxtasks = data.tasks.length;
if(item.t_parent > 0){
maxsubtasks++;
}
});
});
return true;
}
Все работает просто отлично. Мне нужна помощь, потому что теперь я должен вызвать эту функцию в $(document).ready()
, Я хочу построить свой учебный планировщик только после того, как функция get_tasks()
завершено (массив заполнен данными). В противном случае я получу ошибки.
Как это можно решить?
Вот что я имею в $(document).ready()
:
if(get_tasks(first_day,last_day) && get_tmp_data()){ // If this function is done
// This function should be fired -- just like a callback in jQuery
init_learnplanner();
}
4 ответа
Другие ответы не помогли мне, потому что у меня есть 5 функций, которые используют мои данные с $.getJSON
, и мне нужно собрать всю информацию, чтобы даже начать init_learnplanner()
,
После нескольких часов поиска я обнаружил функцию jQuery ajaxComplete, которая работает для меня как чудо. JQuery отслеживает все вызовы AJAX, которые были запущены и запускает все назначенные .ajaxComplete()
когда один завершен.
Вы можете добавить обратный вызов к функции:
function get_tasks(start_date, end_date, callback) {
Затем после заполнения массива в функции вызовите функцию обратного вызова:
if (callback) callback();
Теперь вы можете использовать параметр обратного вызова для инициализации планировщика обучения:
get_tasks(first_day, last_day, function() {
init_learnplanner();
});
Вы должны быть в состоянии указать обратный вызов в $.getJSON
, который выполняется, как только запрос завершен.
РЕДАКТИРОВАТЬ: Вы уже делаете это, но почему бы вам просто не вызвать второй блок кода с конца функции обратного вызова в $.getJSON
?
То, что я делаю, обычно примерно так: просто, выглядит как новичок, но это работает:):D
<script type="text/javascript">
var isBusy = true;
$(document).ready(function () {
// do your stuff here
isBusy = false;
});
function exampleajax() {
if(isBusy) return false;
isBusy=true;
$.ajax({
async: true,
type: 'POST',
url: "???.asp",
dataType: "jsonp",
data: qs,
error: function(xhr, ajaxOptions, thrownError){
//console.log(xhr.responseText + " AJAX - error() " + xhr.statusText + " - " + thrownError);
},
beforeSend: function(){
//console.log( "AJAX - beforeSend()" );
},
complete: function(){
//console.log( "AJAX - complete()" );
isBusy = false;
},
success: function(json){
//console.log("json");
}
});
}
</script>
надеюсь, это поможет вам