Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Sleep bei Ereignis unterbrechen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Sleep bei Ereignis unterbrechen

    This topic has been deleted. Only users with topic management privileges can see it.
    • W
      warhammer73 last edited by

      Hallo,

      ich habe eine Schleife die regelmässig nach Änderungen sucht (Nicht nur in Datenpunkten) und dann für einen Zeitraum schläft.

      Das tut sie mit der Funktion

      function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms * 1000));
      }
      

      auch ganz gut.

      Im Script gibts zum schlafenlegen dann passend

      await sleep(300);
      

      Nun soll das schlafen aber bei bestimmten Ereignissen per on({id: ... unterbrochen werden.
      Bekomme ich das irgendwie hin?

      haus-automatisierung 1 Reply Last reply Reply Quote 0
      • haus-automatisierung
        haus-automatisierung Developer Most Active @warhammer73 last edited by

        @warhammer73 sagte in Sleep bei Ereignis unterbrechen:

        Bekomme ich das irgendwie hin?

        Man könnte noch mit Events arbeiten und wenn das Event gefeuert wird, dann clearTimeout + ebenfalls resolve aufrufen.

        haus-automatisierung 1 Reply Last reply Reply Quote 0
        • haus-automatisierung
          haus-automatisierung Developer Most Active @haus-automatisierung last edited by haus-automatisierung

          Beispiel (ungetestet):

          const EventEmitter = require('events');
          
          const eventEmitter = new EventEmitter();
          
          async function sleep(ms) {
            return new Promise(resolve => {
              const timeout = setTimeout(resolve, ms * 1000);
          
              eventEmitter.on('cancel', () => {
                clearTimeout(timeout);
                resolve();
              });
            });
          }
          
          on({ id: ...}, () => {
            eventEmitter.emit('cancel');
          });
          

          Eventuell wäre es schlauer mit .once() und/oder .removeAllListeners() zu arbeiten. Aber einfach mal rumspielen. Reicht das als Denkanstoß?

          const EventEmitter = require('events');
          
          const eventEmitter = new EventEmitter();
          
          async function sleep(ms) {
            return new Promise(resolve => {
              let timeout = undefined;
          
              timeout = setTimeout(() => {
                timeout = undefined;
                eventEmitter.removeAllListeners('cancel');
          
                resolve();
              }, ms * 1000);
          
              eventEmitter.once('cancel', () => {
                if (timeout) {
                  clearTimeout(timeout);
                }
          
                resolve();
              });
            });
          }
          
          on({ id: ...}, () => {
            eventEmitter.emit('cancel');
          });
          
          1 Reply Last reply Reply Quote 0
          • First post
            Last post

          Support us

          ioBroker
          Community Adapters
          Donate

          812
          Online

          31.9k
          Users

          80.1k
          Topics

          1.3m
          Posts

          2
          3
          110
          Loading More Posts
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes
          Reply
          • Reply as topic
          Log in to reply
          Community
          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
          The ioBroker Community 2014-2023
          logo