setTimeout() und join() mit Javascript
-
Ich habe hier eine Javascript-API, mit der man grob gesagt Werte auf dem Server speichern und abrufen kann. Das Problem dabei ist, dass das ganze synchron verläuft, d.h. die Funktion kehrt nicht zurück, bevor die Antwort vom Server gekommen ist. Da einige Werte beim Laden der Seite gelesen und geschrieben werden, hält das den ganzen Betrieb für einige Sekunden auf, obwohl letztendlich nur 1-2 KB Nutzdaten übertragen werden.
Daher würde ich gerne alle Requests parallel absetzen und dann warten, bis alle fertig sind. Das Problem dabei ist, dass Javascript nicht wirklich multi-threaded ist, d.h. so etwas funktioniert nicht:
var done=false; setTimeout(function() {done=true;},0); while (!done);
Das weitere Laden der Seite soll aber blockiert werden, bis alle Requests fertig sind. Gibt es da einen Trick oder muss ich das alles so umbauen, dass es auch asynchron funktioniert?
Neuerdings gibt es ja web workers, aber die scheinen weitgehend isoliert zu arbeiten, d.h. hätten keinen Zugriff auf die API.
-
Du musst es Asynchron machen.
Warum blockieren? Das macht man nicht.Du zeigst meinetwegen einen Ladebalken an oder sonstwas - aber blockieren ist immer ein No-Go.
Wenn alle Handler fertig sind, dann ersetzt du den Ladebalken durch den geladenen Content.
Du kannst zB in jedem Handler im onComplete eine Variable runterzählen und sobald die variable 0 erreicht hat, sind alle Handler fertig.
-
Das Stichwort ist asynchroner AjaxRequest. jQuery bietet auch eine Möglichkeit mehrere paralelle AjaxRequests zu synchronisieren. siehe jQuery.when()