2012-08-23 7 views
1

J'ai le code suivant. Je suis capable d'appeler la fonction "titlename" et d'exécuter la fonction StatList pour lire le fichier CSV. Cependant, je ne suis pas en mesure de retourner une valeur.À partir de la navigation en ligne, j'ai trouvé que cette question pourrait être liée à Ajax, mais je ne sais pas Ajax. Je veux retourner la variable "titles" dans l'exemple suivant.jquery csv fonction, comment retourner une valeur?

function titlename(title_number) 
{ 
    jQuery.get('TitleName.csv', function StatList(data) 
    { 
      var titles = new Array(); 
     var title_array = jQuery.csv(undefined, undefined, '\r\n')(data); 
     for (var i=0; i<title_number.length; i++){ 
      for (var j = 1; j< title_array.length; j++) 
      { 
       var tmp_compare = title_array[j].slice(0,title_array[j].length-1); 
       if(tmp_compare.toString() == title_number[i]){ 
        var title = title_array[j][(title_array[j].length-1)]; 
        //console.log(title); 
        titles.push(title); 
        break; 
       } 
      } 
     } 
     return titles; 
    }); 
} 
+0

AJAX est asynchrone, votre fonction 'titlename' complète et retourne avant la récupération de la valeur fichier csv est fait. – TheZ

+0

thx, je suis capable de voir cela de l'exécution. Pouvez-vous me dire ce qui peut être fait dans l'exemple ci-dessus pour retourner la variable? – Rkz

Répondre

2

Depuis AJAX est asynchrone, vous ne pouvez pas retourner simplement la valeur d'un appel à titlename. Ce que vous pourriez faire pour utiliser l'information une fois qu'elle arrive est d'appeler une autre fonction et de transmettre les données que vous vouliez récupérer en tant qu'argument. Vous pouvez traiter les données sur place ou les traiter dans la fonction que vous exécutez. À des fins démonstratives, je vais laisser votre code où il était.

Voici un exemple d'une prochaine étape potentielle:

var handleTitleData = function(titles){ 
    // Do whatever you want now that you have the titles 
} 
var titlename = function(title_number){ 
    jQuery.get('TitleName.csv', function StatList(data){ 
     var titles = new Array(); 
     var title_array = jQuery.csv(undefined, undefined, '\r\n')(data); 
     for (var i=0; i<title_number.length; i++){ 
      for (var j = 1; j< title_array.length; j++){ 
       var tmp_compare = title_array[j].slice(0,title_array[j].length-1); 
       if(tmp_compare.toString() == title_number[i]){ 
        var title = title_array[j][(title_array[j].length-1)]; 
        titles.push(title); 
        break; 
       } 
      } 
     } 
     handleTitleData(titles); 
    }); 
} 
+0

Oh merci beaucoup ça marche! – Rkz

2

Comme d'autres l'ont dit, lorsque vous appelez une fonction asynchrone, JavaScript poursuivra son exécution normale, sans attendre qu'il complète, ainsi retournera avant que titles ne soit défini. Afin d'obtenir le résultat de l'appel asynchrone, vous pouvez utiliser un $.Deferred objet:

function titlename(title_number) { 
    return jQuery.get('TitleName.csv').pipe(function (data) { 
     var titles = new Array(); 
     var title_array = jQuery.csv(undefined, undefined, '\r\n')(data); 
     for (var i=0; i<title_number.length; i++) { 
      for (var j = 1; j< title_array.length; j++) { 
       var tmp_compare = title_array[j].slice(0,title_array[j].length-1); 
       if(tmp_compare.toString() == title_number[i]){ 
        var title = title_array[j][(title_array[j].length-1)]; 
        //console.log(title); 
        titles.push(title); 
        break; 
       } 
      } 
     } 
     return titles; 
    }); 
} 

titlename([1,2,3]).done(function(titles) { 
    // do what you want with the returned titles 
}).fail(function() { 
    // deal with a failure in getting the .csv 
}); 
Questions connexes