Как проверить, готова ли / сделана функция JavaScript (jQuery) - PullRequest
1 голос
/ 07 декабря 2010

Я работаю над учебным планировщиком, который получает свои данные (языковые клавиши, задачи, действия и т. Д.) Из базы данных.Поскольку мне нужна строка 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 ]

2 голосов
/ 07 декабря 2010

Вы можете добавить обратный вызов к функции:

function get_tasks(start_date, end_date, callback) {

Затем после заполнения массива в функции вызовите функцию обратного вызова:

if (callback) callback();

Теперь вы можете использовать параметр обратного вызова для инициализации планировщика обучения:

get_tasks(first_day, last_day, function() {
    init_learnplanner();
});
1 голос
/ 07 декабря 2010

Другие ответы не сработали, потому что у меня есть 5 функций, которые используют мои данные с $.getJSON, и мне нужно собрать всю информацию, чтобы даже начать init_learnplanner().

После нескольких часов поиска я обнаружил функцию jQuery ajaxComplete , которая работает для меня как чудо. jQuery отслеживает все ajax-вызовы, которые были запущены, и запускает все, что назначено .ajaxComplete(), когда один завершен.

1 голос
/ 07 декабря 2010

Вы должны иметь возможность указать обратный вызов в $.getJSON, который будет выполнен, как только запрос будет завершен.

РЕДАКТИРОВАТЬ: Вы уже делаете это, но почему бы вам просто не позвонитьвторой блок кода от конца функции обратного вызова в $.getJSON?

0 голосов
/ 07 декабря 2010

То, что я делаю, обычно примерно так: просто, выглядит как новичок, но работает :): 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>

надеюсь, это поможет вам

...