Comment puis-je renvoyer une variable à partir d'une fonction $.getJSON
-
09-06-2019 - |
Question
je veux retourner StudentId
à utiliser ailleurs en dehors du portée de la $.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 cela ne semble pas fonctionner de la même manière c# fait
La solution
Ouais, ma réponse précédente ne fonctionne pas car je n'ai pas prêté attention à votre code.:)
Le problème est que la fonction anonyme est une fonction de rappel - c'est-à-diregetJSON est une opération asynchrone qui reviendra à un moment indéterminé, donc même si la portée de la variable était en dehors de cette fonction anonyme (c'est-à-direune fermeture), cela n'aurait pas la valeur que vous pensez qu'il 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 souhaitez exécuter avec la valeur de studentId définie par l'appel getJSON doit se produire soit dans cette fonction de rappel ou après le rappel s'exécute.
Autres conseils
Cela ne semble pas fonctionner de la même manière que C #
Pour réaliser une portée similaire à C#, désactivez les opérations asynchrones et définissez dataType sur json :
var mydata = [];
$.ajax({
url: 'data.php',
async: false,
dataType: 'json',
success: function (json) {
mydata = json.whatever;
}
});
alert(mydata); // has value of json.whatever
Encore plus simple que tout ce qui précède.Comme expliqué plus tôt $.getJSON
exécute async qui provoque le problème.Au lieu de refactoriser tout votre code vers le $.ajax
méthode, insérez simplement ce qui suit en haut de votre fichier .js principal pour désactiver le comportement asynchrone :
$.ajaxSetup({
async: false
});
bonne chance!
Si vous souhaitez déléguer à d'autres fonctions, vous pouvez également étendre jquery avec le $.fn.notation comme ceci :
var this.studentId = null;
$.getJSON(url, data,
function(result){
$.fn.delegateJSONResult(result.Something);
}
);
$.fn.delegateJSONResult = function(something){
this.studentId = something;
}
var context;
$.ajax({
url: 'file.json',
async: false,
dataType: 'json',
success: function (json) {
assignVariable(json);
}
});
function assignVariable(data) {
context = data;
}
alert(context);
hmm, si vous avez sérialisé un objet avec le StudentId
propriété alors je pense que ce sera :
var studentId;
function(json) {
if (json.length > 0)
studentId = json[0].StudentId;
}
Mais si vous rendez simplement le StudentId
en lui-même, c'est peut-être :
var studentId;
function(json) {
if (json.length > 0)
studentId = json[0];
}
Modifier:Ou peut-être .length
n'est même pas requis (je n'ai renvoyé que des collections génériques en JSON).
Edit #2, ça marche, je viens de tester :
var studentId;
jQuery.getJSON(url, data, function(json) {
if (json)
studentId = json;
});
Edit #3, voici le JS 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