在服务运行之前,Node.js脚本应该等待

我有一个node.js脚本,在启动时启动。 它使用node-redis为Redis创build一个客户端,但在启动时,Redis尚未准备好,而节点已经启动。 所以,它会发出exception并停止执行。

第一部分是这样的:

var redis = require("redis"), jobs = require("jobs"), client = redis.createClient(), runner = new jobs(client, "job-queue",{}); // Continue using runner 

第3行( redis.createClient() )引发exception。

我的解决scheme是做一个无限循环,在try / catch中创build客户端,并在成功时停止循环:

 var redis = require("redis"), jobs = require("jobs"), queue = 'job-queue', client = null, runner = null, createClient = function (redis, jobs, queue) { try { client = redis.createClient(); return new jobs(client, queue, {}); } catch (err) { return null; } }; while(true) { setTimeout(function() { runner = createClient(redis, jobs, queue); }, 1000); if (null !== runner) break; } // Continue using runner 

几秒钟后,这是输出:

 FATAL ERROR: JS Allocation failed - process out of memory 

我该如何解决这个问题? 我正在寻找一个可以在PHP中的解决scheme:

 while (true) { $client = createClient($redis, $jobs, $queue); if ($client instanceof MyClient) break; else sleep(1); } 

setTimeoutasynchronous的 。 JavaScript(和Node.js)有很less的function,在继续之前等待事情发生(如sleep )。 相反,执行继续到下一行,但你传递setTimeout一个callback函数,当它触发时运行。

我会做这样的事情(警告,未经testing):

 var redis = require("redis"), jobs = require("jobs"), queue = 'job-queue'; function initializeRedis(callback) { (function createClient(){ var runner; try { client = redis.createClient(); runner = new jobs(client, queue, {}); } catch (e) {} if (runner){ callback(runner); } else { setTimeout(createClient, 1000); } })(); }; initializeRedis(function(runner){ // Continue using runner });