MB: Wie kann man mit Event einer verarbeitende Funktion unterbrechen

Moin Community,

  • wie kann man eine Funktion mit einem Event abbrechen wenn sie noch im gange ist
  • bzw. durch ein Event eine Funktion unterbrechen und ene andere Funktion starten?

Ich hänge da grad sehr. ich vermute mit Try-Catch-Block?

vgl MB

  1. Hallo,

    • wie kann man eine Funktion mit einem Event abbrechen wenn sie noch im gange ist
    • bzw. durch ein Event eine Funktion unterbrechen und ene andere Funktion starten?

    Ich will nicht behaupten, dass das unmöglich ist, dafür kenne ich JS nicht gut genug. Aber Funktionen sind erstmal dafür da, Aufgaben zu erledigen, die aus dem eigentlichen Code ausgelagert wurden. Man ruft eine Funktion auf, oder eben nicht.

    Ich hänge da grad sehr. ich vermute mit Try-Catch-Block?

    Der Try-Catch-Block ist ein probates Mittel der Fehlerbehandlung, der ähnlich wie ein If-Konstrukt arbeitet.

    Gruß
    Kalk

  2. Tach!

    • wie kann man eine Funktion mit einem Event abbrechen wenn sie noch im gange ist
    • bzw. durch ein Event eine Funktion unterbrechen und ene andere Funktion starten?

    ich vermute mit Try-Catch-Block?

    try-catch ist zur Behandlung unvorhergesehener Zustände da, nicht zur allgemeinen Ablaufsteuerung. In den Ablauf einer Funktion kann man meines Wissens nicht von außen eingreifen. Die ganze Sache hängt auch davon ab, wie Multitasking in Javascript realisiert ist. Wenn die Events erst dann feuern, wenn deine Funktion fertig ist, geht keine Unterbrechung. Den Punkt müssten mal unsere Javascript-Experten beisteuern. Jedenfalls, wenn das Event nebenbei feuert, kannst du, meine ich, nur ein Flag setzen, welches du in der Funktion in regelmäßigen Abständen abfragst und daraufhin den Abbruch einleiten (zum Beispiel eine Schleife verlassen). Hier kann dann aber aus praktischen Gründen ein try-catch eingesetzt werden, wenn der Code zu umfangreich ist, und eine Steuerung mit if-else zu komplex wird.

    Wie greift man nun auf das Flag zu? Die einfachste und unschönste Art ist eine globale Variable. Besser ist es, die Funktion als Objekt zu schreiben mit dem Flag als Eigenschaft oder einer von außen aufzurufenden Methode, die das Flag im Inneren setzt.

    Und die andere Funktion starten - vielleicht hinter dem try-catch bzw. if-else oder im Eventhandler.

    Ich war noch nicht in der Notwendigkeit, sowas machen zu müssen. Meine Überlegungen sind deswegen teilweise theoretischer Natur und ohne die Erfahrung dessen, was realisierbar ist.

    dedlfix.

    1. Moin,

      try-catch ist zur Behandlung unvorhergesehener Zustände da, nicht zur allgemeinen Ablaufsteuerung. In den Ablauf einer Funktion kann man meines Wissens nicht von außen eingreifen. Die ganze Sache hängt auch davon ab, wie Multitasking in Javascript realisiert ist. Wenn die Events erst dann feuern, wenn deine Funktion fertig ist, geht keine Unterbrechung.

      ja, meines Wissens ist das so, aber mein Wissen ist auch nicht besonders solide.

      AFAIK werden zusammenhängende Code-Abschnitte auch ausgeführt, ohne dass man sie kontrolliert unterbrechen könnte; auch Events werden während dieser Ausführungszeit nicht bearbeitet. Das findet erst wieder statt, wenn der Code-Abschnitt komplett abgearbeitet ist (und zwar nicht unbedingt nur die aktuelle Funktion, sondern der ganze übergeordnete Call-Stack), oder wenn der Script-Code von sich aus in einen Wartezustand gelangt, etwa bei einem alert() oder beim Warten auf einen synchronen AJAX-Request.

      Ich war noch nicht in der Notwendigkeit, sowas machen zu müssen. Meine Überlegungen sind deswegen teilweise theoretischer Natur und ohne die Erfahrung dessen, was realisierbar ist.

      Ich überlege außerdem, welche Anforderungen einen solchen Kontrollfluss erfordern. Mag sein, dass es ein sinnvolles Szenario gibt, aber mir kommt das eher konfus vor.

      "Geh mal Holz hacken, bis ich Halt! schreie, und dann zählst du Kartoffeln."

      So long,
       Martin

      --
      Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
      - Douglas Adams, The Hitchhiker's Guide To The Galaxy
      1. "Geh mal Holz hacken, bis ich Halt! schreie, und dann zählst du Kartoffeln."

        Eben wie das wahre Leben. Ich schreibe ein Programm, dann will der Chef "mal eben schnell" was von mir, also unterbreche ich meine Arbeit und fange eine neue an. Nun geht das Telefon, ich nehme ab und beginne Aufgabe Nr. 3 während das Handy klingelt und ich den bisherigen Anrufer einen Moment vertröste.

        Und dann den Überblick behalten, in welcher Reihenfolge nun die unterbrochenen Aufgaben wieder aufzunehmen sind.

        Linuchs

        1. Hallo,

          Eben wie das wahre Leben. Ich schreibe ein Programm, dann will der Chef "mal eben schnell" was von mir, also unterbreche ich meine Arbeit und fange eine neue an. Nun geht das Telefon, ich nehme ab und beginne Aufgabe Nr. 3 während das Handy klingelt und ich den bisherigen Anrufer einen Moment vertröste.

          so ähnlich kenne ich das auch. Und das reale Problem der dauernden Unterbrechungen ist außerdem ein psychologisches: Selbst wenn man mal eine Weile Ruhe hat und sich so gesehen auf eine Aufgabe konzentrieren könnte, schafft man es oft doch nicht, weil man unbewusst doch immer auf die nächste Störung lauert.

          Und dann den Überblick behalten, in welcher Reihenfolge nun die unterbrochenen Aufgaben wieder aufzunehmen sind.

          Die "richtige" Reihenfolge ist in solchen chaotischen Situationen meistens nicht die, in der man die einzelnen Sachen angefangen hat, sondern die, in der der Chef (oder der Kunde) die Fertigstellung erwartet. Manchmal kann man das ahnen, aber oft genug liegt man mit der Ahnung daneben. Und dann ist der Chef unzufrieden, denn "Das hätte auch bis morgen Zeit gehabt, habe ich Ihnen doch gesagt." Naja, vielleicht hat er's gedacht, jedenfalls nicht deutlich gesagt.

          So long,
           Martin

          --
          Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
          - Douglas Adams, The Hitchhiker's Guide To The Galaxy
          1. Hallo,

            Ich will ja die Funktion mit diesen Parametern abrechen und die selbe mit anderen Parametern füttern bis sie wieder abgebrochen wird oder bis zum ende durchläuft.

            vgl mb

      2. Moin,

        "Geh mal Holz hacken, bis ich Halt! schreie, und dann zählst du Kartoffeln."

        :D exakt den Nagel auf den kopf getroffen.

        VGL MB

        1. Hallo,

          "Geh mal Holz hacken, bis ich Halt! schreie, und dann zählst du Kartoffeln."

          :D exakt den Nagel auf den kopf getroffen.

          ja, schon klar - aber das geht halt in Javascript so nicht. Denn während die Funktion holzhacken() läuft, läuft nichts anderes. Da kann also niemand "Halt!" schreien.

          So long,
           Martin

          --
          Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
          - Douglas Adams, The Hitchhiker's Guide To The Galaxy
          1. tja, JavaScript ist eben nicht für s web geeignet bezogen auf thread technologie. Ist auch sinnfrei aber ich will ja wie dedlfix gesagt hat das mit Flags machen. Außerdem ist das Spielerei Martin.

            vlg MB

            1. Hallo,

              tja, JavaScript ist eben nicht für s web geeignet bezogen auf thread technologie.

              das würde ich nicht sagen. Geh mal auf diese Seite, schalte die Genauigkeit, die Bildgröße und die Zahl der Threads hoch, und beobachte dann die CPU-Auslastung. Hier kommt die Web-Worker-Technik zum Einsatz.

              Gruß
              Jürgen

              1. erstaunliche Leistung JürgenB, bist du Mathematiker? hab von diesen Fibonacci Fuktion auf wikipedia gelesen.

                vlg MB

                1. Hallo,

                  erstaunliche Leistung JürgenB, bist du Mathematiker? hab von diesen Fibonacci Fuktion auf wikipedia gelesen.

                  ich kenne die Fibonacci-Folge seit meiner Schulzeit. Die Schule hat uns mal einen Besuch der Stuttgarter Staatsgalerie angedeihen lassen, weil die Kids ja auch mal ein bisschen an die Kunst herangeführt werden müssen. Ich denke, das muss so um 1983..85 gewesen sein.

                  Mein damaliger bester Kamerad und ich waren im Alter von gut 15 Jahren beide schon total "verdorben" von der damals grassierenden Computer-Welle; wir waren beide recht gewiefte C64-Programmierer und hatten Spaß an mathematischen Zahlenspielereien.
                  Die alten Meister haben uns ebensowenig angesprochen wie moderne Skulpturen; auch die Fett-Ecke von Joseph Beuyss empfanden wir als Verarschung des Publikums. In der Staatsgalerie war aber damals auch ein fast raumfüllendes Werk von Mario Merz ausgestellt, das durch eine Reihe von Neonröhren auffiel, die zu Zahlen geformt waren. Mein Kumpel und ich haben eine Weile gerätselt, was diese Zahlenfolge darstellt, und sind gemeinsam auf die mathematische Vorschrift gekommen. Am nächsten Tag haben wir gemeinsam Lexika gewälzt (Wikipedia gab's damals noch nicht) und festgestellt, dass diese Zahlenfolge als Fibonacci-Folge bekannt ist.

                  Seither ist mir das ein Begriff.

                  So long,
                   Martin

                  --
                  Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                  - Douglas Adams, The Hitchhiker's Guide To The Galaxy
                  1. nabend Martin,

                    ich meinte ja auch nicht fn-1 + fn+2 sondern all die schönen Zahlenbeispiele - wobei ich Zahlen hasse. Ich mag viel lieber variablen. Zahlen sagen mir nichts. Hab ich aber auch glaube ich schonmal gesagt.

                    Uff, C64 Programmierer? Mit imperative Programmierung und lochkarten und so? Ich wäre da viel zu verzettelt um struktur rein zu bekommen. Da muss ich meinen Hut ziehen vor Leuten wie dir :-).

                    vgl MB

                    1. Hallo,

                      ich meinte ja auch nicht fn-1 + fn+2 sondern all die schönen Zahlenbeispiele - wobei ich Zahlen hasse. Ich mag viel lieber variablen. Zahlen sagen mir nichts. Hab ich aber auch glaube ich schonmal gesagt.

                      dabei kann man doch gerade die Fibonacci-Folge schön in Prosa formulieren: Jedes Glied ist die Summe der zwei vorhergehenden.

                      Uff, C64 Programmierer? Mit imperative Programmierung und lochkarten und so? Ich wäre da viel zu verzettelt um struktur rein zu bekommen. Da muss ich meinen Hut ziehen vor Leuten wie dir :-).

                      Naja, der "Brotkasten" war in den 80er Jahren einer der Marktführer unter den Heimcomputern, technisch seiner Zeit weit voraus.

                      Ich war aber nicht der Typ, der nur illegal Software (Spiele) tauschen und daddeln wollte. Ich wollte selbst etwas schaffen, selbst programmieren. Und ich habe sehr schnell begriffen, dass das C64-BASIC mich nicht sehr weit bringen würde. Also habe ich mich in Assembler eingefuchst. Hab damals schon eine ganze Reihe von Tools und Erweiterungen programmiert, das eine oder andere auch namhaften Software-Firmen zur Vermarktung angeboten. Ist leider nie was draus geworden.

                      So long,
                       Martin

                      --
                      Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                      - Douglas Adams, The Hitchhiker's Guide To The Galaxy
                      1. Hallo Martin,

                        ich meinte ja auch nicht fn-1 + fn+2 sondern all die schönen Zahlenbeispiele - wobei ich Zahlen hasse. Ich mag viel lieber variablen. Zahlen sagen mir nichts. Hab ich aber auch glaube ich schonmal gesagt.

                        dabei kann man doch gerade die Fibonacci-Folge schön in Prosa formulieren: Jedes Glied ist die Summe der zwei vorhergehenden.

                        Die Formulierung ist vielleicht schön, aber auch falsch. Sie lässt $$f(0)$$ und $$f(1)$$ ausser acht:

                        $$ f(0) = 1
                        f(1) = 1
                        f(n) = f(n - 1) + f(n - 2) $$

                        LG,
                        CK

                      2. nichts anderes habe von dir gehalten ;-).

                        echt schade. Ich hab auch mal in assebler reingeschnuppert aber es danach gelassen weil mir das zuuu zeitaufwändig schien mir da einzuarbeiten. Aber ich find super wenn man sowas kann.

                        gute nacht bzw. guten morgen

                2. Hallo,

                  erstaunliche Leistung JürgenB, bist du Mathematiker? hab von diesen Fibonacci Fuktion auf wikipedia gelesen.

                  fast, ich bin Physiker. Zahlenspiele sind ein Hobby.

                  Gruß
                  Jürgen

            2. Tach!

              tja, JavaScript ist eben nicht für s web geeignet bezogen auf thread technologie. Ist auch sinnfrei aber ich will ja wie dedlfix gesagt hat das mit Flags machen.

              Na, nee, geht ja nicht so ohne weiteres. Du musst dazu auch ein kooperatives Multitasking emulieren, sonst kann ja kein Eventhandler aufgerufen werden, der ein Flag setzen könnte. Kooperatives Multitasking funktioniert so, dass ein Prozess von sich aus Rechenzeit freigeben muss. Historische Windows- und Mac OS-Versionen funktionierten nach diesem Prinzip. Wenn ein Prozess nicht kooperativ war, hing das ganze System. Die Sache mit dem Flag kannst du also nur dann machen, wenn du auch beispielsweise den Ansatz von JürgenB verfolgst - oder die WebWorker-API verwendest.

              dedlfix.

    2. try-catch ist zur Behandlung unvorhergesehener Zustände da, nicht zur allgemeinen Ablaufsteuerung. In den Ablauf einer Funktion kann man meines Wissens nicht von außen eingreifen.

      Hallo dedlfix,

      Die ganze Sache hängt auch davon ab, wie Multitasking in Javascript realisiert ist.

      garnicht denke ich. habe ich so gelesen

      Wenn die Events erst dann feuern, wenn deine Funktion fertig ist, geht keine Unterbrechung. Den Punkt müssten mal unsere Javascript-Experten beisteuern. Jedenfalls, wenn das Event nebenbei feuert, kannst du, meine ich, nur ein Flag setzen, welches du in der Funktion in regelmäßigen Abständen abfragst und daraufhin den Abbruch einleiten (zum Beispiel eine Schleife verlassen).

      Sehe ich auch so. dann bleibt mir nix anderes übrig.

      Hier kann dann aber aus praktischen Gründen ein try-catch eingesetzt werden, wenn der Code zu umfangreich ist, und eine Steuerung mit if-else zu komplex wird.

      er ist umfngreich für meine Begriffe umfangreicht.

      Wie greift man nun auf das Flag zu? Die einfachste und unschönste Art ist eine globale Variable.

      benutze ich seeehr selten und es ist unschön. habe ich von euch gelernt ;-).

      Schönen Dank für die Bestätigung. LG MB

  3. Hallo,

    meines Wissens nach kann man Javascripte (noch?) nicht untzerbrechen. Ich habe das Problem bisher folgendermaßen gelöst:

    • Ich setze die Inhalte von rechenintensiven Schleifen in eine eigene Funktion, die sich dann über setTimeout nach kürzest möglicher Zeit selbst aufruft. Dadurch haben andere Prozesse, z.B. auch Eventhandler die Chance, zur Ausführung zu kommen. Primär mache ich das, um das „Einfrieren“ des Browsers bei rechenintensiven Scripten zu verhindern. Aber auch Statusausgaben und Programmabbruch sind so möglich.

    • Einsatz der Web-Worker-Technik. In diesem Fall aber zu aufwändig.

    Gruß
    Jürgen

    1. Hallo,

      In diesem Fall aber zu aufwändig.

      Was meinst du mit „diesem Fall“? Hat MB irgendwie einen konkreten Fall genannt?

      Gruß
      Kalk

      1. Hallo,

        Was meinst du mit „diesem Fall“? Hat MB irgendwie einen konkreten Fall genannt?

        das Unterbrechen einer Funktion durch ein Event.

        Gruß
        Jürgen

        1. Hallo,

          das Unterbrechen einer Funktion durch ein Event.

          ah ja, ok. Das hatte ich als Lösungsvermutung für Theos nicht genannten Fall angesehen.

          Gruß
          Kalk

    2. Hallo JürgenB,

      • Ich setze die Inhalte von rechenintensiven Schleifen in eine eigene Funktion, die sich dann über setTimeout nach kürzest möglicher Zeit selbst aufruft. Dadurch haben andere Prozesse, z.B. auch Eventhandler die Chance, zur Ausführung zu kommen. Primär mache ich das, um das „Einfrieren“ des Browsers bei rechenintensiven Scripten zu verhindern. Aber auch Statusausgaben und Programmabbruch sind so möglich.

      Du meinst so etwas?

      function foo(acc) {
        if(acc < 100) {
          window.setTimeout(foo, 0, acc+1);
        }
      }
      foo(0);
      

      Falls ja: beachte, dass damit die Abarbeitung auch deutlich langsamer wird. Falls nein: was meinst du?

      LG,
      CK

      1. Hallo Christian,

        Du meinst so etwas?

        ja.

        Falls ja: beachte, dass damit die Abarbeitung auch deutlich langsamer wird. ...

        ich achte daher darauf, das die Schleife in Blöcke mit etwa einer Zehntelsekunde Laufzeit zerlegt werden.

        Gruß
        Jürgen

        1. Hallo JürgenB,

          Falls ja: beachte, dass damit die Abarbeitung auch deutlich langsamer wird. ...

          ich achte daher darauf, [...]

          War doof ausgedrückt, ich meinte, MB soll darauf achten falls er diesen Weg beschreiten will ;)

          das die Schleife in Blöcke mit etwa einer Zehntelsekunde Laufzeit zerlegt werden.

          Eine zehntel Sekunde? Das dürfte massiv abhängig sein von diversen Faktoren (Browser, OS, Auslastung, …), ich glaube nicht, dass dieses Kriterium hier sonderlich zuverlässig ist.

          LG,
          CK

          1. Hallo Christian,

            das die Schleife in Blöcke mit etwa einer Zehntelsekunde Laufzeit zerlegt werden.

            Eine zehntel Sekunde? Das dürfte massiv abhängig sein von diversen Faktoren (Browser, OS, Auslastung, …), ich glaube nicht, dass dieses Kriterium hier sonderlich zuverlässig ist.

            das ist letztendlich ein Kompromiss zwischen Performance und Wartezeit auf die Reaktion auf ein Ereignis.

            Gruß
            Jürgen

    3. Hallo Jürgen,

      also das klingt sehr interessant und ich weis das das fürs web unmgeeignet ist. ist nur spielerei. habe ich vergessen zusagen. Genau mein Fall beschäftigt sich mit deinem gelösten.

      gruß MB

    • wie kann man eine Funktion mit einem Event abbrechen wenn sie noch im gange ist
    • bzw. durch ein Event eine Funktion unterbrechen und ene andere Funktion starten?

    Das geht nicht. JavaScript hat eine Run-To-Completion Semantik, die sicherstellt, dass der Callstack immer erst vollständig abgearbeitet wird, bevor eine neue Aufgabe aus der Event-Queue bearbeitet wird. Das Zusammenspiel von Callstack und Event-Queue habe ich schon früher beschrieben.

  4. Codebeispiel:

    window.onresize = function() {
      resize();
    };
    
    resize function() {
      var layer = getLayers();        // je nach fenster größe
      var positions = getPositions(); // je nach fenster größe
      var steps = computeSteps( layers, positions ); // für meine begriffe sehr rechen intensiv
      slideLayersAndPositions( steps );              // auch nicht ohne
      // ^hier soll der abbruch die funktion mich
      //  wie von dedlfix genennten Flag unterbrochen werden 
      // und wieder von vorn begrinnen
    };
    

    ich hab mir überlegt ob ich das Event in größeren abständen machen soll. Es geht mir um performance

    lg mb

    1. Es geht mir um performance

      Dann wirf erstmal einen Profiler an. Die hat jeder Browser heute an Board.

      ich hab mir überlegt ob ich das Event in größeren abständen machen soll

      Das macht man häufig, unter dem Stichwort "Event Throttling" oder "Event Debouncing" solltest du fündig werden.

      1. Danke Dir :-)

        vlg MB

      2. Hallo 1up,

        Es geht mir um performance

        Dann wirf erstmal einen Profiler an. Die hat jeder Browser heute an Board.

        wie kann man Browsertechnisch Profiling heran ziehen?? Ich hab das noch nie gehört und ich habe Chrom, Firefox. I Einstellungen?

        Das was du mir empfohlen hast ist sehr interessant. werde mich damit beschäftigen.

        vlg MB

        1. Dann wirf erstmal einen Profiler an. Die hat jeder Browser heute an Board.

          wie kann man Browsertechnisch Profiling heran ziehen?? Ich hab das noch nie gehört und ich habe Chrom, Firefox. I Einstellungen?

          Profiler sind Teil der mitgelieferten Browser-Entwicklertools, die lassen sich in der Regel mit F12 öffnen. Die besten Performance-Tools findest du in Chrome, inbesondere die Timeline ist für mich unverzichtbar geworden.