2016-04-26 51 views
1

我正在使用自定義間隔函數來確保函數執行已經完成,直到下一次運行。一般情況下,我會執行以下操作,檢查redis數據庫並檢查該工作是否由sidekiq執行。如果它被執行,我向數據庫發出一個請求,如果它被寫入到數據庫中,那麼我運行這個函數10次,如果在第10次之後沒有數據,我解析undefined。我想知道我現在所擁有的解決方案是否可以改進。執行間隔後的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'來做一個「done()」if(typeof t ==='undefined'|| t - > 0)' – dandavis

+0

@BenjaminGruenbaum決心是'藍鳥'承諾我沒有包括它在這個代碼片段中。 –

回答

1

嗯,你正在使用現代和的NodeJS你提到你正在使用的承諾和藍鳥讓我們用用發電機和藍鳥一個現代化的解決方案。

你不應該經常使用promise構造函數。你可以promisify的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 –