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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top