异步函数中的SetTimeout和setInterval

问题描述 投票:0回答:1
   var processStatusCheck = setInterval(function statusCheck() {
    sequelize.query(dbQuery).then(function (data) {
       winston.info(' Status:', importStatus);
      if (importStatus ===  true) {
        winston.info('Inside', pollCount);
        clearInterval(processStatusCheck);
        addProcess(Id, function (response) {
               res.send(200)
        });
      } else {
        if(pollCount > 15){
          winston.info('It came here !!!', pollCount);
           res.sendStatus(500);      
        }else{
          winston.info('Incrementing.....');
          pollCount++;
          setTimeout(statusCheck, 18000);
        }
      }
    });
  }, 5000);

我正在尝试实现异步Javascript函数。我想不断查询数据库直到状态变为真,

最初,按照setInterval在5秒钟后进行调用,但是一旦达到setTimeout,它将连续调用该函数。我希望在18秒后调用它。如果在setTimmeout中时间少于5秒,则立即发送响应,并且出现“无法在发送标头后设置标头”错误。

具有setInterval和setTimeout是否在这里引起我问题?请指导我。

javascript node.js asynchronous settimeout setinterval
1个回答
0
投票

仍然没有遵循期望的逻辑,因为您还没有真正解释您期望它如何工作。我将描述您在做什么,并指出该流程中的一些缺陷。

  1. 您开始每5秒钟运行一次的间隔。
  2. 一直运行到importStatus变为true,但此循环中的任何内容都没有设置importStatus,因此似乎永远无法满足。
  3. 您在循环内进行数据库查询,但是甚至从不引用数据库查询的结果。我认为那是不对的。同样,您发布的内容中肯定缺少一些代码。
  4. 然后,在间隔进行15次迭代之后,您还将开始每18秒执行一次setTimeout()
  5. 因此,5秒间隔和18秒setTimeout()都在运行。
  6. 然后,在进行15次迭代后,您执行res.sendStatus(500),但从不停止setInterval(),它会一直运行并在每次触发时都尝试执行res.sendStatus(500)

问题摘要:

  1. 此代码中的任何内容都不会对importStatus进行任何操作,因此基于此代码永远不会是true。我假设您的真实代码必须不同于此处显示的代码。
  2. 如果importStatus从不为true(请参见上一点),则您永远不会停止间隔-它会永远运行。您可能需要在几个地方停止间隔计时器。当然,在执行res.sendStatus(500)时将其停止,并且可能在开始执行setTimeout()时也将其停止。
  3. 间隔的15次迭代后,您开始进行setTimeout()设置18秒钟。因此,现在间隔和setTimeout()都在运行。您似乎不太希望那样。开始执行setInterval()]时,也许应该停止setTimeout()
  4. addProcess()显示了异步样式的回调接口,但是没有机会进行错误处理。它真的是一个没有错误的函数吗?
  5. 您甚至都没有引用data,这是数据库查询结果,因此从不使用该查询。
© www.soinside.com 2019 - 2024. All rights reserved.