JQuery ajax: Wert an übergeordnete Variable weitergeben

Yaslaw

alter Rempler
Moderator
Ich habe den folgenden Code. Darun wird über Ajax ein JSON-Response ausgewertet.

Javascript:
    var valid = true;
	
    $.ajax({
        type: "POST",
        url: "ajax.php",
        data: {'action': 'AjaxValidate', 'name': fieldClass, 'value': formField.val()},
        success: function(data){
            var json = $.parseJSON(data);
            errorField.html('JS:' + json.msg);
            valid = json.valid;
            console.info('ajax::' + fieldClass + ': ' + valid);
        }
    });
    console.info('f::' + fieldClass + ': ' + valid);
Konsole Auswertung:
Code:
ajax::kid: false
f::kid: true
Es geht dabei um die Variable valid. Im Ajax-Aufruf ist sie false, noch dem Ajax-Befehl wieder True
Wie kriege ich es hin, dass meine Variable ausserhalb des Ajax-Aufrufes ebenfalls false wird?
 
Du könntest direkt auf das window-Objekt zugreifen, also so:
Code:
var valid = true;

$.ajax({
  type    : 'POST',
  url     : 'ajax.php',
  data    : {
    'action' : 'AjaxValidate',
    'name'   : fieldClass,
    'value'  : formField.val()
  },
  success : function (data) {
    var json = $.parseJSON(data);
    errorField.html('JS:' + json.msg);
    window.valid = valid = json.valid;
    console.info('ajax::' + fieldClass + ': ' + valid);
  }
});
console.info('f::' + fieldClass + ': ' + valid);
 
window.valid: Ist das dann eine superglobale Variable? Dann brauch ich die definiteion 'var valid' nicht mehr und window.valid ist auch ausserhab dieser Funktion gültig?
 
Das window-Objekt ist sozusagen die unterste Ebene in Javascript, in der alle Variablen und Funktionen definiert werden. Man kann schon sagen, dass window so etwas wie eine Superglobale Variable ist.
 
Das Problem ist doch ein anderes und zwar die Bedeutung des Wortes "nach".

Die Variable "valid" ist nach¹ dem request immer noch true.
Die Variable "valid" ist nach² dem request false.

1: Wenn man die Position im Code betrachtet, steht das console.log nach dem Request.
2. Wenn man den zeitlichen Ablauf betrachtet, steht das console.log vor dem Request, weil dieser asynchron ist.


Wenn du zum Test (nicht produktiv) den Request synchron ausführst (async: false), dann sind beide Ausgaben identisch.
 
CPoly hat natürlich recht. Das würde auch meine (euch nicht kundgetane) Irritation erklären, weshalb dieses Problem überhaupt bestehen sollte.
 
Ich nehme an du benutzt jQuery http://api.jquery.com/jQuery.ajax/

Javascript:
var valid = true;
    
$.ajax({
        //HUHU
	async: false,
	type: "POST",
	url: "ajax.php",
	data: {'action': 'AjaxValidate', 'name': fieldClass, 'value': formField.val()},
	success: function(data){
		var json = $.parseJSON(data);
		errorField.html('JS:' + json.msg);
		valid = json.valid;
		console.info('ajax::' + fieldClass + ': ' + valid);
	}
});
console.info('f::' + fieldClass + ': ' + valid);


Eine weitere Möglichkeit es zu visualisieren (wenn async true ist) wäre folgendes:

Javascript:
var valid = true;
    
$.ajax({
	type: "POST",
	url: "ajax.php",
	data: {'action': 'AjaxValidate', 'name': fieldClass, 'value': formField.val()},
	success: function(data){
		var json = $.parseJSON(data);
		errorField.html('JS:' + json.msg);
		valid = json.valid;
		console.info('ajax::' + fieldClass + ': ' + valid);
	}
});

setInterval(function() {
    console.info('f::' + fieldClass + ': ' + valid);
}, 25);


Jetzt wird alle 25ms der Wert ausgegeben. Sobald der AJAX Request zurück kommt, sollte die Ausgabe sich ändern.
 

Neue Beiträge

Zurück