![](/img/trans.png)
[英]Wait for download method to finish before running next .then - 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.