Hallo,
Bei Asynchronen Requests blockiert die Ausführung des Programms nicht, sondern läuft einfach weiter, während der Request abgearbeitet wird. In Deinem Beispiel wird der Request abgeschickt:
req.open('get', xurl);
req.send(null);
und dann die Funktion (save1) sofort verlassen (mit return result). - es wird nicht gewartet, bis der Request erfolgreich (oder auch nicht) beantwortet wurde. Daher steht das Ergebnis des Aufrufs bei Verlassen der Funktion noch gar nicht fest, deswegen liefert save1() grundsätzlich nicht das Erwartete zurück.
Dein Event-Handler
req.onreadystatechange = function () {...}
hingegen ist genau dafür da, Dinge erst dann zu tun, wenn ein Ergebnis vorliegt - der Inhalt der Funktion wird erst ausgeführt, wenn der Request beantwortet wurde.
Wenn Du also etwas ausführen möchtest, was von dem Ergebnis des Requests abhängig ist (z.b. Dein zweiter Request save2()), so musst Du das in diesen Handler schreiben.
Wenn Du einen dritten Request starten möchtest, aber erst, wenn der zweite fertig ist, so muss dieser Aufruf in den onreadystatechange-Handler in "save2()"...und so fort.
Wenn Du mehrere solcher Request-Funktionen (save1....saveX) hast, und diese sehr ähnlich sind, würde ich mir überlegen, ob man das nicht etwas generischer lösen kann (z.b. mit einem Array aus Request-Objekten, dem nach jedem erfolgreichen Request ein weiteres Request-Objekt entnommen und verarbeitet wird, so lange, bis das Array leer ist). Aber das sind dann eher kosmetische Korrekturen ;)
Hope that helps,
Jörg