【问题标题】:How to setTimeout in node.js?如何在 node.js 中设置超时?
【发布时间】:2012-04-13 15:57:42
【问题描述】:

如果函数内部发生故障,我需要能够在node.js 中进行重试。我已经设置了一个如下所示的 while 循环,但是对于如何包装函数调用以确保它不会阻塞我的整个服务器,我有点困惑。

我该怎么办?

while(retryCount < 10 && !success){

    // Alternative one
    while(new Date().getTime() < now + 1000) {
        myFunction();
    }

    // Or:
    setTimeout( myFunction(), 1000);
}

【问题讨论】:

    标签: node.js asynchronous blocking


    【解决方案1】:

    您可以在函数对象中存储尝试次数。对cronjob来说会很好。如果您在请求上下文中需要相同的行为,则必须将尝试计数器存储在请求范围内(而不是在函数对象中)。

    var fnc = function() {
            console.log('try');
            if (true) { // Error condition
                    // Error here
                    if (!fnc.tryes) fnc.tryes = 0;
                    fnc.tryes++;
                    console.log(fnc.tryes);
                    if (fnc.tryes <= 10) {
                            setTimeout(fnc, 1000);
                    } else {
                            fnc.tryes = 0;
                    }
                    // Something wrong
            } else {
                    // We hame result
            }
    };
    
    fnc();
    

    【讨论】:

      【解决方案2】:

      我会说使用 setTimeout 方法,这样客户端就不会卡在检查时间的 while 循环中。

      【讨论】:

        【解决方案3】:

        外部 while 循环将阻塞,您必须使用 only setTimeout 进行重构。然而,你想要这种东西的事实向我表明你的代码结构真的很糟糕,需要更多的修改。你在重试什么?您如何检测错误情况?做 10 次真的会提高成功的机会吗?

        我有一个包含通用函数的要点,它可以为你做这种事情,但如果这是一个 XY 问题,我不愿意分享。

        【讨论】:

        • 它将用于 CRONjob,向公共 API 发出 HTTP 请求并提取一些数据。在出现HTTP错误的情况下,我想让脚本休眠一段时间,然后再试几次
        • @Industrial gist.github.com/2106760。修改以适应您的需求。那是非阻塞的,要么添加错误检查,要么复制模式。任何时候你有一个while 循环,你都会阻塞。
        猜你喜欢
        • 2011-09-02
        • 1970-01-01
        • 2019-02-09
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        • 2013-12-21
        • 2014-06-13
        • 2017-08-06
        相关资源
        最近更新 更多