2015-01-02 3 views
0

Я создал http-сервер в node.js, и я хочу, чтобы функция запускалась через определенное время каждый раз, когда есть запрос. Я попытался использовать setTimeout() для этого. Но проблема в том, что я хочу, чтобы несколько таймеров выполнялись одновременно, а setTimeout сбрасывается каждый раз, когда выполняется новый запрос. Может ли кто-нибудь помочь мне в том, как это сделать?Как использовать setTimeout более одного раза одновременно в nodejs

Вот код, который я пробовал:

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

Непонятно, что вы пытаетесь сделать. 'setTimeout()' ничего не сбрасывает, когда вызывается более одного раза. Он создает новое событие таймера для каждого его вызова. Возможно, у вас есть проблема, потому что вы снова и снова используете одну и ту же переменную timeout. – jfriend00

+0

Да, это была ошибка, которую я сделал. объявила тайм-аут глобальной переменной. спасибо за просвещение –

ответ

1

Может это происходит потому, что timeout и interval объявлены в глобальном масштабе, то они переопределены при каждом запросе (они относятся к одной переменной). Вместо этого попробуйте использовать var, чтобы заставить эти переменные в области видимости функции getVersion «s:

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

Я написал„возможно“, потому что я не проверял, но имеет смысл. Во всяком случае, избегайте глобальных переменных сферы, если они не нужны.

Смежные вопросы