jQuery request.done keine überspeicherung

05/17/2013 17:25 Ravenstorm#1
Hallo Leute,

da ich mich nach langem wieder an mein CMS gesetzt habe und nun per jQuery einen request durchlaufen lasse, diesen aber nicht richtig bearbeiten kann brauch ich eure Hilfe.

Folgendermaßen ich habe nun erstmal 2 Dateien Collection.php & Save_Col.php

Collection.php:
PHP Code:
var request = $.post('controller/Save_Col.php', { datadataToSend } );
var 
test "TestString";

request.done(function(jsonArray){

   var 
requestData JSON.parse(jsonArray);
   
test requestData.msg;

   
console.log("TestVariable_Done: " test); //MsgString

});

console.log("TestVariable: " test); //TestString sollte jedoch MsgString sein 
So nun die Frage, ich überspeichere doch die test var im .done block warum erhalte ich nach dem Block jedoch wieder die unveränderte variable?
05/17/2013 17:52 Cooltek#2
Hey,
du befindest dich in einer Funktion
Code:
function(jsonArray)
Wie war das nochmal mit dem Scope von Variablen? Wenn ichs richtig im Kopf hab ists wie in PHP: in Funktionen definierte Variablen gelten ausserhalb dieser nicht, genauso sind alle ausserhalb definierten Variabeln (sofern es keine Globals sind) nicht vorhanden. Ich glaub, damit hab ich dein Problem gelöst oder? :)
lg
05/17/2013 17:57 mydoom#3
Das klingt nach einem typischen Denkfehler beim Umgang mit asynchronen Funktionen:

request.done() wird erst aufgerufen, nachdem

Code:
console.log("TestVariable: " + test);
ausgegeben wurde. Somit ergibt sich die Situation:

"TestVariable: TestString"
"TestVariable_Done: ..."


@Cooltek:
Das ist nicht ganz richtig: In Javascript gelten selbst mit "var" im globalen Kontext definierte Variable als globale Variable und sind sehr wohl [Only registered and activated users can see links. Click Here To Register...].
05/17/2013 18:04 Ravenstorm#4
Quote:
Originally Posted by mydoom View Post
Das klingt nach einem typischen Denkfehler beim Umgang mit asynchronen Funktionen:

request.done() wird erst aufgerufen, nachdem

Code:
console.log("TestVariable: " + test);
ausgegeben wurde. Somit ergibt sich die Situation:

"TestVariable: TestString"
"TestVariable_Done: ..."


@Cooltek:
Das ist nicht ganz richtig: In Javascript gelten selbst mit "var" definierte Variable im globalen Kontext als globale Variable und sind sehr wohl in der Funktion verfügbar.
Da scheint der Fehler zu liegen.

Dort wo
PHP Code:
console.log("TestVariable: " test); 
steht, steht aber normalerweiße ein
PHP Code:
return value
da es die Value des jEditable in eine Zelle der Tabelle schreibt.
Allerdings will ich die Value vorher durch das .done abfragen und dann erst eintragen, nur weiß ich nun nicht, wie ich da vorgehen sollte.
05/17/2013 18:17 mydoom#5
Quote:
Originally Posted by Ravenstorm View Post
Dort wo
PHP Code:
console.log("TestVariable: " test); 
steht, steht aber normalerweiße ein
PHP Code:
return value
Das ergibt für mich keinen Sinn, da dort quasi immer "TestString" zurückgegeben werden sollte.

// Oder null undefined wenn value gar nicht definiert wurde.
05/17/2013 18:32 Ravenstorm#6
Quote:
Originally Posted by mydoom View Post
Das ergibt für mich keinen Sinn, da dort quasi immer "TestString" zurückgegeben werden sollte.

// Oder null undefined wenn value gar nicht definiert wurde.
Du kannst es auch als
PHP Code:
return test
sehen. Somit macht es für dich vielleicht mehr Sinn.
05/17/2013 18:54 mydoom#7
Nicht wirklich, da $.post nur ein Alias für

Code:
$.ajax({
  type: "POST",
  url: url,
  data: data,
  success: success,
  dataType: dataType
});
also einer AJAX-Funktion von jQuery ist. Und die haben die nette Eigenschaft asynchron zu sein:
Quote:
Originally Posted by http://api.jquery.com/jQuery.ajax/
The first letter in Ajax stands for "asynchronous," meaning that the operation occurs in parallel and the order of completion is not guaranteed. The async option to $.ajax() defaults to true, indicating that code execution can continue after the request is made.
Du kannst also gar nicht davon ausgehen, dass der Request abgeschlossen und Daten zurückgekommen sind, nur weil die Anweisung im Code nach der Callback-Funktion steht.
05/17/2013 19:08 MrPuschel#8
Setz das async flag auf false.

[Only registered and activated users can see links. Click Here To Register...]
05/17/2013 19:21 mydoom#9
Quote:
Originally Posted by MrPuschel View Post
Setz das async flag auf false.

[Only registered and activated users can see links. Click Here To Register...]
Quote:
Originally Posted by http://api.jquery.com/jQuery.ajax/
Setting this option to false (and thus making the call no longer asynchronous) is strongly discouraged, as it can cause the browser to become unresponsive.
:confused:

//Edit:
Quote:
Originally Posted by http://api.jquery.com/jQuery.ajax/
Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active.
05/17/2013 19:41 MrPuschel#10
Quote:
Originally Posted by mydoom View Post
:confused:
PHP Code:
$.ajax({
  
type"POST",
  
urlurl,
  
datadata,
  
successsuccess,
  
dataTypedataType,
  
asyncfalse
}); 
Mit dem setting async auf false wird der request nicht asynchron ausgeführt.
05/17/2013 19:53 mydoom#11
Das ist mir schon klar. Ich habe die Dokumentation gelesen und oben zitiert weshalb das keine gute Idee ist.
05/17/2013 20:28 MrPuschel#12
Quote:
Originally Posted by mydoom View Post
Das ist mir schon klar. Ich habe die Dokumentation gelesen und oben zitiert weshalb das keine gute Idee ist.
Und das passiert warum?
05/17/2013 20:54 mydoom#13
Weil Javascript im UI-Thread läuft.
05/17/2013 21:45 MrPuschel#14
Quote:
Originally Posted by mydoom View Post
Weil Javascript im UI-Thread läuft.
Da mach dir mal keine Sorgen. Die JavaScript Engine läuft in ihrem eigenen thread und legt den UI thread sicher nicht schlafen. In der jquery Implementation bedeutet das async flag nur das die Rückgabe nicht als callback läuft sondern prozedural abläuft.

Es wird also auf eine Rückgabe gewartet. Das schlimmste was dir passieren kann ist, das du auf einen timeout warten musst wenn das Ziel nicht erreichbar ist. Es ist kein gutes Design synchrone requests abzusetzen, manchmal jedoch Notwendig und ganz sicher schießt es deinen Browser nicht ohne Grund ab.
05/17/2013 21:54 mydoom#15
Du kannst ja mal zum Spaß ne Endlosschleife in js starten und dir ansehen was passiert. Warum sollte man nicht einfach alles in der Callback-Funktion bearbeiten?