我有一个在启动时启动的node.js脚本。它使用node-redis为Redis创建客户端,但是在启动时Redis尚未就绪,而节点已经启动。因此,它会给出异常并停止执行。
第一部分看起来像这样:
var redis = require("redis"),
jobs = require("jobs"),
client = redis.createClient(),
runner = new jobs(client, "job-queue",{});
// Continue using runner
第3行(redis.createClient()
)抛出异常。
我的解决方案是进行无限循环,在try / catch中创建客户端,并在成功时停止循环:
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中的解决方案:
while (true) {
$client = createClient($redis, $jobs, $queue);
if ($client instanceof MyClient) break;
else sleep(1);
}
答案 0 :(得分:3)
setTimeout
异步。 JavaScript(和Node.js)只有很少的函数可以在继续之前等待某些事情发生(比如sleep
)。相反,执行会立即继续执行到下一行,但是您会传递setTimeout
一个回调函数,该函数在触发时运行。
我会做这样的事情(警告,未经测试):
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
});