2016-04-26 67 views
1

カスタムインターバル関数を使用して、次回実行するまで関数の実行が最初に終了していることを確認しています。私はredisデータベースをチェックし、そのジョブがsidekiqによって実行されたかどうかを確認します。それが実行された場合、私はそれに書き込まれている場合、私はデータベースに要求を行う情報を取得するために、私は10回目の後に私は未定義のデータがない解決この関数を実行します。私が今解決している解決策をどうにかして改善できるかどうかは疑問です。インターバルが実行された後のjavascriptコールバック

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

'解決 'とは何ですか? –

+0

あなたが 'else 'を' if(typeof t ===' undefined '|| t--> 0) 'に追加することでdone()を行うことができます。 – dandavis

+0

@BenjaminGruenbaum解決は' bluebird '約束です。それはこのコードスニペットにあります。 –

答えて

1

さて、あなたは、現代のNodeJSを使用しているとあなたが約束を使用し、青い鳥それでは、発電機やブルーバードを使用して近代的なソリューションを使用してみましょうしている言及しました。

プロビジョニングコンストラクタを頻繁に使用しないでください。あなたはredis APIを約束して、あなたの人生を楽にしてくれるでしょう:

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

ありがとう、私はそれを与えるだろうもう一つの事NodeJSゲームを改善するためにいくつかのリソースを教えてください:) –

+0

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

関連する問題