2016-04-26 5 views
1

Ich benutze die benutzerdefinierte Intervallfunktion, um sicherzustellen, dass die Ausführung der Funktion zuerst beendet wurde, bis sie das nächste Mal ausgeführt wird. Im Allgemeinen mache ich folgendes Ich überprüfe die redis-Datenbank und überprüfe, ob der Job von sidekiq ausgeführt wurde. Wenn es ausgeführt wurde, erstelle ich eine Anfrage an die Datenbank, um die Informationen zu holen, wenn es darauf geschrieben wurde, ich führe diese Funktion 10 Mal aus, wenn nach dem 10. Mal keine Daten aufgelöst undefiniert sind. Ich frage mich, ob die Lösung, die ich gerade habe, irgendwie verbessert werden kann.Javascript Rückruf nach Ablauf des Intervalls

const interval = (func, wait, times) => { 
    const interv = function(w, t){ 
     return() => { 
     if (typeof t === 'undefined' || t-- > 0) { 
      setTimeout(interv, w); 
      try { 
      func.call(null); 
      } 
      catch (e) { 
      t = 0; 
      throw e.toString(); 
      } 
     } 
     }; 
    }(wait, times); 
    setTimeout(interv, wait); 
    }; 

    let intervalCount = 0; 
    interval(() => { 
     intervalCount++; 
     redisClient.lrange('queue:default', 0, -1, (err, results) => { 
     const job = results.find((element) => { return JSON.parse(element).jid === jobId; }); 
     if (job === undefined) { 
      checkDatabase(personId).then((result) => { 
      if (result) { 
       resolve(checkDatabase(personId)); 
      } else if (intervalCount >= 10) { 
       resolve(undefined); 
      } 
      }); 
     } 
     }); 
    }, 1500, 10); 
+1

Was ist 'resolve'? –

+0

Sie können ein "done()" durch Hinzufügen eines 'else' zu' if (typeof t === 'undefiniert' || t--> 0) ' – dandavis

+0

@BenjaminGruenbaum Auflösung ist 'Bluebird' Versprechen habe ich nicht enthalten es in diesem Code-Snippet. –

Antwort

1

Nun, Sie verwenden moderne NodeJS und Sie erwähnten Sie verspricht verwenden und drossel also lassen Sie uns eine moderne Lösung drossel mit Generatoren und verwenden.

Sie sollten den Promethe-Konstruktor nicht sehr oft verwenden. Sie können die Redis-API promiziieren und Ihr Leben einfacher machen:

Promise.promisifyAll(require("redis")); // now redis is promisified 


var pollAndResolve = Promise.coroutine(function* pollAndResolve() { 
    for(var i = 0; i < 10; i++) { 
     yield Promise.delay(1500); // wait 1500 ms 
     yield redisClient.lrangeAsync('queue:default', 0, -1); // since we promisifed 
     const job = results.find((element) => JSON.parse(element).jid === jobId); 
     if (result) return yield checkDatabase(personId); 
    } 
}); 
+0

Danke Ich werde es versuchen, eine weitere Sache können Sie mich bitte auf einige Ressourcen zeigen, um NodeJS Spiel verbessert zu bekommen :) –

+0

http://bluebirdjs.com/docs/api-reference.html http://bluebirdjs.com /docs/api/promise.coroutine.html –