【问题标题】:how to use setTimeout more than once simultaneously in nodejs如何在nodejs中同时多次使用setTimeout
【发布时间】:2015-01-02 04:50:40
【问题描述】:

我在 node.js 中创建了一个 http 服务器,我希望每次有请求时在特定时间后运行一个函数。我尝试为此使用 setTimeout() 。但问题是我希望多个计时器同时运行,并且每次发出新请求时 setTimeout 都会重置。谁能帮助我如何做到这一点?

这是我尝试过的代码:

http.createServer(getVersion).listen(process.env.PORT, process.env.IP);

function getVersion(req, res) {
    if (url.parse(req.url).pathname === "/") {
    timeout = setTimeout(function() {
        Downloadurls.find({ Downloadurl : randstring }).exec(function (err,result) {
            if (err) { console.log(err) }
            if (!result.length) { 
                Downloadurl_doc = new Downloadurls({
                Downloadurl: randstring
                });
                Downloadurl_doc.save();
            }
        });
    }, timeoutSeconds*1000);
    interval = setInterval(function() {
    console.log('Time left: '+getTimeLeft(timeout)+'s');
    if (getTimeLeft(timeout) === 0)
       { clearInterval(interval);}
    }, 1000);

    function getTimeLeft(randstring1[i]) {
        return Math.ceil((timeout._idleStart + timeout._idleTimeout - Date.now()) / 1000);
    }
    }
}

【问题讨论】:

  • 不清楚您要做什么。 setTimeout() 在多次调用时不会重置任何内容。每次调用它都会创建一个新的计时器事件。也许您遇到了问题,因为您一遍又一遍地重用相同的 timeout 变量。
  • 是的,那是我犯的错误。将超时声明为全局变量。感谢您的启发

标签: node.js httprequest settimeout


【解决方案1】:

也许这是因为timeoutinterval 是在全局范围内声明的,然后在每次请求时都会被覆盖(它们引用相同的变量)。相反,尝试使用var 将这些变量强制到getVersion 的函数范围内:

....
var timeout = setTimeout(function() {
....
var interval = setInterval(function() {
....

我写“也许”是因为我没有测试它,但它是有道理的。无论如何,如果不需要,请避免使用全局范围变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2019-04-16
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多