Ich versuche mal wieder zurück zum eigentlichen Problem zu kommen. Scheinbar scheint es hier einfach noch etwas am Verständnis für AJAX-Requests zu fehlen.
Ich würde dir empfehlen, für den Anfang erstmal auf Abkürzungen wie $.post() zu verzichten und einfach $.ajax() zu verwenden, denn dabei ist viel klarer, was du eigentlich tust. Ohne den genauen Kontext zu kennen, würde ich pauschal erstmal davon ausgehen, dass du hier kein synchrones Request benötigst.
Wenn der Nutzer auf asynchron geladene Inhalte wartet, blendet man gerne irgendein animiertes Status Bild ein, welches dann, nachdem die Inhalte vorliegen, wieder ausblendet. Hier mal ein kurzes Beispiel dazu auf Basis deines ersten Beispiels:
Code:
var test = 'TestString';
// Status img anzeigen
$('#some_status_img').show();
$.ajax({
url: 'controller/Save_Col.php',
data: dataToSend,
dataType: 'json',
type: 'POST',
success: function(data) {
// AJAX-Request abgeschlossen, data enthält den bereits geparsten JSON-String
// Status img ausblenden
$('#some_status_img').hide();
test = data.msg;
console.log("TestVariable_Done: " + test); //MsgString
}
});
// AJAX-Request ist hier noch nicht abgeschlossen, der nachfolgende Aufruf ergibt den Wert, mit dem test initialisiert worden ist
console.log("TestVariable: " + test); //TestString sollte jedoch MsgString sein
Du musst dir einfach abgewöhnen, hierbei prozedural zu denken und stattdessen in Callbacks denken.
Man kann sich das ein bisschen mit Dominosteinen verdeutlichen: Während du bei einem prozeduralen Script z.B. 100 Steine in einer Reihe hast, die alle nacheinander umfallen, wenn du den ersten umstößt, sieht die Sache bei verwendung asynchroner Requests mit Auswertung über Callback-Funktionen etwas anders aus. Hier hättest du für das vorherige Beispiel etwa 4 seperate Reihen à 25 Steine, wobei die nächte Reihe immer erst dann angestoßen wird, wenn die durch die erste Reihe gestartete Aktion abgeschlossen ist.