Ich baue einen Konzertkalender, der sehr schwer auf Javascript (mit jQuery) ist. Ich habe Probleme, verschiedene Ereignisse in der App zu synchronisieren, und ich suche nach Vorschlägen, wie das geht.Javascript Event Synchronisation
Ein Beispiel für einen einfachen Anwendungsfall:
- Benutzer einen Monat in diesem Monat
- Kalender überspringt klickt
Ein Beispiel für einen komplexeren Anwendungsfall:
- Benutzer wählt einen Künstler aus
- Kalender bestimmt t er Datum dieser ersten Ausstellung des Künstlers
- Kalender überspringt in diesem Monat
- Kalender macht deutlich, dass Künstler Show (s)
Ein mögliches Problem ist, dass der neue Monat ist noch nicht von der Zeit gemacht ich versuche, um die Show (n) des Künstlers hervorzuheben. Daher wird die Show nicht hervorgehoben, obwohl diese Funktionen der Reihe nach aufgerufen werden. Offensichtlich ist setTimeout() ziemlich hacky und funktioniert nicht garantiert.
Also zuerst, eine einfache Frage - wäre es jemals möglich (auch in Chrome) für die folgende Funktion aus der Reihe zu laufen?
function steps(){
stepOne(); //TAKES 30 SECONDS
stepTwo(); //TAKES < 1 SECOND
}
Zweitens, eine verwandte einfache Frage:
If placed at the end of a function, will a JS callback ALWAYS run after everything else in the given function has finished running?
Wenn ja, ich konnte Nest jede Funktion als Rückruf seiner vorherigen Funktion. Aber das würde wahrscheinlich unhandlich werden, wenn man die verschiedenen Anwendungsfälle betrachtet.
Hier ist ein Ansatz, den ich überlege mir:
1) Allow each function an optional callback parameter. If it's present, call it at the very end of the function. 2) During a UI refresh, create an array, and stack any functions to be called within this array. 3) Once this "script" is completed, iterate through the array, calling each function in the order it was added, using the next function as the previous function's callback.
Ich stelle mir dies würde sicherstellen, dass alle Funktionen in Reihenfolge aufgerufen werden.
Ein weiterer Ansatz ist Ereignis-Listener mit
$(document).bind("listener.name", fnCallback);
Und dann ruft
$(document).trigger("listener.name");
Jedes Mal, wenn das Ereignis eintritt zu befestigen.
Ich denke jedoch, dass dies auch etwas unhandlich wäre, wenn man bedenkt, dass verschiedene Ereignisse abhängig vom Anwendungsfall unterschiedliche Funktionen aufrufen müssen. Ich konnte immer
$(document).unbind("listener.name");
vor dem Hinzufügen neuer Ereignisse nennen, aber auch hier - ich bin Neigung Art eines Master „Drehbuch“ zu erstellen, wie ich im ersten Ansatz vorgeschlagen.
Hoffentlich ist das nicht zu vage - keine Rückmeldung? Irgendwelche Erfahrungen mit komplexen UIs, die verschiedene Ereignisse synchronisieren mussten?
Vielen Dank,
Michael
Ich denke, das ein guter Punkt ist, dass es jQuery Konvention folgt. Ich habe jedoch festgestellt, dass es manchmal Situationen gibt, in denen ein Timeout von 1 ms funktioniert, wo es vorher nicht war. Das macht für mich keinen Sinn (wenn JS-Aufrufe wirklich in der richtigen Reihenfolge ausgeführt werden - natürlich ohne asynchrone Aufrufe), aber es ist ein Hack, mit dem ich jetzt leben muss. Danke, jeder - alle Ratschläge sehr geschätzt :) – marclar
Ich dachte, dass Code bekannt vorkam! :) – DMCS