2008-08-27 4 views
45

Je veux revenir StudentId utiliser ailleurs en dehors du champ du $.getJSON()

j.getJSON(url, data, function(result) 
{ 
    var studentId = result.Something; 
}); 

//use studentId here 

J'imagine que cela a à voir avec la portée, mais il ne semble pas fonctionner de la même façon C# fait

Répondre

37

Oui, ma réponse précédente ne fonctionne pas parce que je n'ai pas fait attention à votre code.

Le problème est que la fonction anonyme est une fonction de rappel - par exemple getJSON est une opération asynchrone qui reviendra à un moment indéterminé, même si la portée de la variable était en dehors de cette fonction anonyme (ie une fermeture), il ne serait pas la valeur que vous pensez qu'elle devrait:

var studentId = null; 
j.getJSON(url, data, function(result) 
{ 
    studentId = result.Something; 
}); 

// studentId is still null right here, because this line 
// executes before the line that sets its value to result.Something 

Tout code que vous voulez exécuter avec la valeur de StudentID fixée par l'appel getJSON doit se produire soit au sein cette fonction de rappel ou après le rappel s'exécute.

-2

hmm, si vous avez un numéro de série d'un objet avec la propriété StudentId alors je pense que ce sera:

var studentId; 
function(json) { 
    if (json.length > 0) 
     studentId = json[0].StudentId; 
} 

Mais si vous êtes juste retourner le StudentId lui-même peut-être c'est:

var studentId; 
function(json) { 
    if (json.length > 0) 
     studentId = json[0]; 
} 

Modifier: Ou peut-être .length n'est même pas nécessaire (j'ai seulement retourné des collections génériques en JSON).

Edit # 2, cela fonctionne, je viens de tester:

var studentId; 
jQuery.getJSON(url, data, function(json) { 
    if (json) 
     studentId = json; 
}); 

Edit # 3, voici les JS réels que j'ai utilisé:

$.ajax({ 
    type: "POST", 
    url: pageName + "/GetStudentTest", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    data: "{id: '" + someId + "'}", 
    success: function(json) { 
     alert(json); 
    } 
}); 

Et dans le aspx.vb:

<System.Web.Services.WebMethod()> _ 
<System.Web.Script.Services.ScriptMethod()> _ 
Public Shared Function GetStudentTest(ByVal id As String) As Integer 
    Return 42 
End Function 
2

Si vous souhaitez déléguer à d'autres fonctions, vous pouvez également étendre jquery avec $ .fn. notation comme ceci:

 

var this.studentId = null; 

$.getJSON(url, data, 
    function(result){ 
     $.fn.delegateJSONResult(result.Something); 
    } 
); 

$.fn.delegateJSONResult = function(something){ 
    this.studentId = something; 
} 

 
59

il ne semble pas fonctionner de la même façon C# ne

Pour accomplir la portée similaire à C#, désactiver les opérations asynchrones et mettre dataType à JSON:

var mydata = []; 
$.ajax({ 
    url: 'data.php', 
    async: false, 
    dataType: 'json', 
    success: function (json) { 
    mydata = json.whatever; 
    } 
}); 

alert(mydata); // has value of json.whatever 
+3

C'est une bien meilleure solution, car getJSON est un appel asynchrone, donc la variable définie dans le délégué n'est pas accessible avant que l'appel asynchrone soit terminé. – Annagram

+0

Fait intéressant, j'avais "& callback =?" dans mon URL qui semblait remplacer le paramètre async: false. –

+2

Merci! Maintenant, je peux faire quelque chose ici ... – Rimian

16

Encore plus simple que tout ce qui précède. Comme expliqué précédemment $.getJSON exécute async qui provoque le problème. Au lieu de refactorisation tout votre code à la méthode $.ajax il suffit d'insérer les éléments suivants dans le haut de votre fichier principal .js pour désactiver le comportement async:

$.ajaxSetup({ 
    async: false 
}); 

bonne chance!

+2

c'est doit être la meilleure réponse –

+0

D'accord avec @MostafaKing – danMad

+0

C'est de loin la meilleure réponse. Merci @bicycle. –

-1
var context; 
$.ajax({ 
    url: 'file.json', 
    async: false, 
    dataType: 'json', 
    success: function (json) { 
    assignVariable(json); 
    } 
}); 

function assignVariable(data) { 
    context = data; 
} 
alert(context); 
+0

La question a été posée il y a environ 9 ans et votre réponse n'ajout pas d'amélioration significative à vos réponses déjà postées. – Khan

Questions connexes