首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行服务之前,Node.js脚本应等待

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

Stack Overflow用户
提问于 2011-10-17 03:18:03
回答 1查看 839关注 0票数 1

我有一个在引导时启动的node.js脚本。它使用node-redis为Redis创建一个客户端,但是在启动时,Redis还没有准备好,而node已经启动了。因此,它会给出一个异常并停止执行。

第一部分看起来像这样:

代码语言:javascript
复制
var redis  = require("redis"),
    jobs   = require("jobs"),
    client = redis.createClient(),
    runner = new jobs(client, "job-queue",{});

// Continue using runner

异常在第3行(redis.createClient())中抛出。

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

代码语言:javascript
复制
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

几秒钟后,输出如下:

代码语言:javascript
复制
FATAL ERROR: JS Allocation failed - process out of memory

我该如何解决这个问题呢?我正在寻找一个可能在php中的解决方案:

代码语言:javascript
复制
while (true) {
    $client = createClient($redis, $jobs, $queue);
    if ($client instanceof MyClient) break;
    else sleep(1);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-17 03:33:13

setTimeout是异步的。JavaScript (和Node.js)有很少的函数可以在继续之前等待某些事情发生(比如sleep)。相反,执行会立即继续到下一行,但是您向setTimeout传递了一个回调函数,该函数在触发时运行。

我会这样做(警告,未测试):

代码语言:javascript
复制
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
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7786660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档