Funktions-Rückgabewerte

tequila slammer

Erfahrenes Mitglied
Hallo Forum,

als Einsteiger in JavaScript habe ich bisher gelernt, das anders als in anderen Sprachen es in JS kein void gibt. Das bedeutet, ich kann mit return jeden beliebigen Wert zurückgeben. Wenn dem so ist verstehe ich folgendes Verhalten der untenstehenden Funktion nicht.
Code:
function DeleteItem(basketId, basketItemId) {

    var parameters = "{basketId: '" + basketId + "',productBasketId: '" + basketItemId + "'}"
    var response;

    $.ajax({
        type: "POST",
        url: "http://localhost/DataService.asmx/DeleteFromBasket",
        data: parameters,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            response = true;
        },
        error: function(msg) {
            response = false;
        }
    });

    return response;
}

Nach meinem Verständnis, muss die Funktion entweder true oder false zurückgeben. Mein Problem ist nun, dass im IE8 und FF undefine zurück kommt. Eine Ausnahme stellt der FF mit JavaScript-Debugging über Firebug dar. Dann erscheint auch tatsächlich das erwartete Ergebnis.

Ich muss zwei Sachen anmerken. Erstens undefine kommt, weil ich response nicht vorbelegt habe und die Webservice Methode gibt nichts (void) zurück.

Aufgerufen wird die Funktion dann so:

Code:
$(".deleteItem").click(function() {

                var basket = '<%= Session["basket"].ToString() %>';
                var itemId = $(this).attr('rel');
                var response2 = DeleteItem(basket, itemId);

                alert(response2); //debug-ausgabe

                if (response2) {
                    $(this).parent().parent().remove();
                }
                return false;
            });

Woher kommt dieses Verhalten - kann das am Rückgabewert des Webservice liegen?
 
Moin,

das was dort in $.ajax() passiert, hat mit der Funktion selbst nicht direkt etwas zu tun.

AJAX läuft asynchron, du kannst davon ausgehen, dass die Funktionen success/error erst aufgerufen werden, wenn die Ausführung von DeleteItem bereits abgeschlossen ist.

Von der Warte aus kannst du die Funktion so betrachten:

Code:
function DeleteItem(basketId, basketItemId) {

    var parameters = "{basketId: '" + basketId + "',productBasketId: '" + basketItemId + "'}"
    var response;
 
     /* 
  //Das ist unerheblich für den Rückgabewert 
  $.ajax({
        type: "POST",
        url: "http://localhost/DataService.asmx/DeleteFromBasket",
        data: parameters,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            response = true;
        },
        error: function(msg) {
            response = false;
        }
    });
*/

    return response;
}
...was das Ergebnis erklärt.
 
Hallo Sven,

das würde erklären, warum ich beim debuggen einen erwarteten Wert erhalten, da das Schrittweise durchgehen dem asyncronen Ablauf etwas mehr Zeit verschaft.
Aber wie könnte ich nun mein Ziel erreichen, eine Fallunterscheidung abhängig vom Ajax-Ergebnis zu implementieren und dieses zurückzugeben. Denn scheinbar kann ich mit

Code:
$(this).parent().parent().remove();
im Success Event nicht das Elternelement löschen.
 
Hi,

verleg die Aktion einfach in die success-Funktion. Hierfür übergibst du das auslösende Element als zusätzliches Argument:
Code:
$(".deleteItem").click(function() {
  var basket = '<%= Session["basket"].ToString() %>';
  var itemId = $(this).attr('rel');
  var response2 = DeleteItem(basket, itemId, this);
  return false;
});

DeleteItem könnte so aussehen:
Code:
function DeleteItem(basketId, basketItemId, _this) {

    var parameters = "{basketId: '" + basketId + "',productBasketId: '" + basketItemId + "'}"
    var response;

    $.ajax({
        type: "POST",
        url: "http://localhost/DataService.asmx/DeleteFromBasket",
        data: parameters,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            response = true;
            $(_this).parent().parent().remove();;
        },
        error: function(msg) {
            response = false;
        }
    });

    return response;
}

Ciao
Quaese
 

Neue Beiträge

Zurück