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

标签 javascript node.js settimeout

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

第一部分是这样的:

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);
}

最佳答案

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
});

关于javascript - Node.js 脚本应该在服务运行之前等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786660/

相关文章:

javascript - 尝试使用 Knockout ViewModel 实现 SignalR

javascript - API 响应显示在 console.log 中但不显示在 React 页面上

javascript 这两段代码有什么不同?

javascript - Sequelize V5->V6 升级 : Typescript Error Property 'x' does not exist on type 'y'

javascript - 使用 Tree 布局 v4(版本 4)将节点动态添加到 D3.js 中的叶节点

javascript - 在 ipad 上触发 unhover/mouseout/blur

javascript - 需要关于如何在 Sequelize 中填充 "through"表的建议?

javascript - 循环总是结束,即使有 setTimeout

JavaScript setTimeout 奇怪的行为

javascript - 无法在 Node js 中设置超时