2 Stimmen

Javascript jquery ajax Objekt bei Erfolg zurückgeben

Hier ist ein einfacher Ajax-Aufruf, der in eine Methode eingebettet ist.

MyNS.GetStringList = function (successCallback, failedCallback) {
var methodUrl = serverUrl + "/GetStringList";
$.ajax({
    type: "GET",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    url: methodUrl, // Ort des Dienstes
    data: {}, // Daten an den Server gesendet
    beforeSend: function (XMLHttpRequest) {
        // stellt sicher, dass die Ergebnisse als JSON zurückgegeben werden.
        XMLHttpRequest.setRequestHeader("Accept", "application/json");
    },
    success: successCallback,
    error: failedCallback
});
}

Hier ist eine Methode, die die obige Methode aufruft.

function GoGetTheStringList() {
        var stringList;
        stringList = MyNS.GetStringList(function (data) { return data.d; }, function (XmlHttpRequest, textStatus, errorThrown) {
            alert("Fehler");
        });

        alert(reasonsDictionary); // DAS IST UNDEFINIERT!

    }

Was ist die richtige Syntax, um die Methode 1 dazu zu bringen, das data.d-Objekt zurückzugeben?

Vielen Dank wie immer! Jon

6voto

Ioannis Karadimas Punkte 7506

Es kann wirklich nicht. Ajax-Aufrufe sind asynchron, was bedeutet, dass die Methode zurückgegeben wird, bevor der success Rückruf aufgerufen wird.

EDIT / Korrektur: Es könnte möglich sein, aber Sie müssen die jQuery ajax async Option auf false setzen, was bedeutet, dass Sie einen synchronen Aufruf ausführen, was wiederum bedeutet, dass Ihre gesamte App darauf wartet, dass er zurückkehrt. Es ist am besten, wenn Sie Ihrem Funktion einen Rückruf übergeben, der aufgerufen wird, wenn success aufgerufen wird.

Als Antwort auf Ihren Beitrag: Ja, es wird undefiniert sein, da es außerhalb des Kontexts liegt. Was Sie tun müssen, ist Ihre Daten im Rückruf zu verarbeiten, weil Sie zu diesem Zeitpunkt wissen, dass Sie sie haben, und weil Sie Daten nicht als Ergebnis von Funktion A von Funktion B zurückgeben können. In Ihrem Rückruf sollten Sie eine Funktion aufrufen, um die erhaltenen Daten zu verarbeiten.

var latestData;
function getStuff(succeeded,failed) {...}
function gotStuff(dataWrapper) {
    latestData = dataWrapper.d;
    doThingsWithStuffData(dataWrapper.d);
}

getStuff(gotStuff, function () { ... });

0voto

aziz punjani Punkte 25368

Sie können jQuery deferred verwenden, da es für diesen Zweck besser geeignet ist.

MyNS.GetStringList = function () {
var methodUrl = serverUrl + "/GetStringList";
return $.ajax({                            // return hier, das wird ein Deferred-Objekt zurückgeben
          type: "GET",
          contentType: "application/json; charset=utf-8",
          dataType: "json",
          url: methodUrl, // Standort des Dienstes
          data: {} // An den Server gesendete Daten
       });
}

Sie sollten nicht müssen

beforeSend: function (XMLHttpRequest) {
            // stellt sicher, dass die Ergebnisse als JSON zurückgegeben werden.
            XMLHttpRequest.setRequestHeader("Accept", "application/json");
           },

Dafür ist das dataType: 'json' da, es gibt jQuery einen Hinweis darauf, was in der Antwort vom Server erwartet wird.

Dann in Ihrer Funktion

function GoGetTheStringList() {
      var stringList;
      $.when( MyNS.GetStringList() )   
      .done(function( data ){  console.log( data.d );  }); 
      .fail(function( data ) { console.log('Anforderung fehlgeschlagen'); });
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X