Frage

Ich möchte zurückkehren StudentId zur Verwendung an anderer Stelle außerhalb der Umfang des $.getJSON()

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

//use studentId here

Ich könnte mir vorstellen, dass das mit dem Scoping zu tun hat, aber es scheint nicht auf die gleiche Weise zu funktionieren C# tut

War es hilfreich?

Lösung

Ja, meine vorherige Antwort funktioniert nicht, weil ich Ihrem Code keine Beachtung geschenkt habe.:) :)

Das Problem besteht darin, dass die anonyme Funktion eine Callback-Funktion ist – d. h.getJSON ist eine asynchrone Operation, die zu einem unbestimmten Zeitpunkt zurückkehrt, also selbst wenn der Gültigkeitsbereich der Variablen außerhalb dieser anonymen Funktion liegt (d. h.ein Abschluss), hätte es nicht den Wert, den Sie sich vorstellen:

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

Jeder Code, den Sie mit dem durch den getJSON-Aufruf festgelegten Wert von studentId ausführen möchten, muss ebenfalls ausgeführt werden innerhalb diese Callback-Funktion oder nach Der Rückruf wird ausgeführt.

Andere Tipps

Es scheint nicht so zu funktionieren, wie C# tut

Um eine ähnliche Festlegung wie in C# zu erreichen, deaktivieren Sie asynchrone Vorgänge und setzen Sie dataType auf json:

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

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

Noch einfacher als alles oben Genannte.Wie bereits erklärt $.getJSON führt asynchron aus, was das Problem verursacht.Anstatt Ihren gesamten Code umzugestalten $.ajax -Methode fügen Sie einfach Folgendes oben in Ihre .js-Hauptdatei ein, um das asynchrone Verhalten zu deaktivieren:

 $.ajaxSetup({
   async: false
 });

viel Glück!

Wenn Sie andere Funktionen delegieren möchten, können Sie jquery auch mit $.fn erweitern.Notation etwa so:


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, wenn Sie ein Objekt mit dem serialisiert haben StudentId Eigentum, dann denke ich, dass es sein wird:

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

Aber wenn Sie das einfach zurückgeben StudentId selbst vielleicht ist es:

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

Bearbeiten:Oder vielleicht .length ist nicht einmal erforderlich (ich habe nur generische Sammlungen in JSON zurückgegeben).

Edit Nr. 2, das funktioniert, ich habe es gerade getestet:

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

Bearbeiten Sie Nr. 3, hier ist das tatsächliche JS, das ich verwendet habe:

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

Und in der 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top