簡體   English   中英

Node.js腳本應在服務運行之前等待

[英]Node.js script should wait before service is running

我有一個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);
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM