2010-12-07 4 views
1

Je travaille sur un planificateur d'apprentissage qui obtient ses données (langues, tâches, activités, etc.) à partir d'une base de données. Parce que j'ai besoin d'une chaîne JSON, je l'ai encodée avec json_encode pour l'utiliser en JavaScript. J'ai une fonction différente (pour les clés, tâches, activités, etc.) qui obtient ces données et les écrit dans un tableau.Comment vérifier si la fonction javascript est prête/prête (jQuery)

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

Tout fonctionne très bien. J'ai besoin d'aide, car je dois maintenant appeler cette fonction en $(document).ready(). Je veux construire mon planificateur d'apprentissage seulement une fois que la fonction get_tasks() est terminée (le tableau est rempli de données). Sinon, j'obtiendrai des erreurs.

Comment cela peut-il être résolu?

Voici ce que j'ai en $(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(); 
} 
+0

En note: Vous devriez créer votre objet avec 'task [i] = {t_id: item.t_id, t_title: item.t_title, ...}' ou peut-être même suffit-il de faire 'task [i ] = item'. –

Répondre

1

D'autres réponses n'ont pas travaillé pour moi parce que j'ai 5 fonctions qui utilisent mes données avec $.getJSON, et je dois avoir recueilli toutes les informations pour même commencer init_learnplanner().

Après plusieurs heures de recherche, j'ai découvert la fonction jQuery ajaxComplete, qui fonctionne comme un charme pour moi. jQuery suit tous les appels ajax qui ont été déclenchés et déclenche tout ce qui est assigné .ajaxComplete() quand il est terminé.

1

Vous devriez être en mesure de spécifier un rappel dans $.getJSON, qui est exécuté dès la demande est terminée.

EDIT: Vous faites déjà cela, mais pourquoi n'appelez-vous pas le deuxième bloc de code à la fin de la fonction de rappel dans $.getJSON?

0

Ce que je fais est généralement quelque chose comme ceci: simple, ressemble débutant, mais il fonctionne :): 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> 

espoir cette aide vous

2

Vous pouvez ajouter un rappel à la fonction:

function get_tasks(start_date, end_date, callback) { 

Ensuite, après avoir rempli le tableau dans la fonction, appelez la fonction de rappel:

if (callback) callback(); 

Maintenant, vous pouvez utiliser le paramètre de rappel pour initialiser le planificateur d'apprentissage:

get_tasks(first_day, last_day, function() { 
    init_learnplanner(); 
}); 
Questions connexes