Javascript setTimeout在脚本中不工作,无法重试数据库连接

Javascript setTimeout在脚本中不工作,无法重试数据库连接,javascript,Javascript,我正在编写一些代码,希望尝试建立数据库连接并重试有限的次数,将每次尝试之间的时间增加一倍 我有一个半工作版本。唯一的问题是,我认为setTimeout计时不起作用,因为每次连续重试都会立即执行。这是上面的脚本 试试这个: // initConnection should be called a max of 50 times // timeout timer in ms var NUM_RETRIES = 50; var TIMEOUT = 200; var initConnection =

我正在编写一些代码,希望尝试建立数据库连接并重试有限的次数,将每次尝试之间的时间增加一倍

我有一个半工作版本。唯一的问题是,我认为setTimeout计时不起作用,因为每次连续重试都会立即执行。这是上面的脚本

试试这个:

// initConnection should be called a max of 50 times
// timeout timer in ms
var NUM_RETRIES = 50;
var TIMEOUT = 200;

var initConnection = function (callback) {
    var result = Math.floor((Math.random() * 5) + 1);
    console.log(result);
    if (result > 1) {
        return callback('error: trouble connecting.');
    }
    return callback(null);
};

var tryConnection = function (callback) {
    setTimeout(function () {
        console.log('timeout:' + TIMEOUT + 'ms');
        initConnection(function (err) {
            if (err) {
                TIMEOUT = TIMEOUT * 2;
                NUM_RETRIES -= 1;

                if (NUM_RETRIES) {
                    return tryConnection.call(this, callback);
                }
                return callback('error: gave up.');
            }
            return callback();
        })
    }, TIMEOUT);
};

var run = function () {
    tryConnection(function (err) {
        if (err) {
            return console.log(err);
        }
        console.log('connected!');
    });
};

run();
setTimeout
中,我们需要传递一个函数,该函数将在延时后调用。但是您在超时时调用该函数/方法,而不是传递它,这会导致意外行为

例如:

var callMe = functiion() {}
setTimeout(callMe(), 20000); // call immediately
setTimeout(callMe, 20000); // call after 20000ms delay

您在解决方案中到底想要什么?快速浏览看起来您需要在其中添加一个NUM_重试检查。如果你正在寻找清理回调地狱的东西,你可以做一些事情。我已经更新了标题、描述、代码和提琴。一切似乎都正常工作,但随后对setTimeout的每次调用似乎都会立即执行。我没有看到每次重试之间有任何延迟。在我的特殊情况下,回调地狱是有必要的。
var callMe = functiion() {}
setTimeout(callMe(), 20000); // call immediately
setTimeout(callMe, 20000); // call after 20000ms delay