【发布时间】:2020-06-29 19:50:05
【问题描述】:
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 函数。我想不断地查询数据库,直到状态变为真,
最初调用是在 5 秒后根据 setInterval 进行的,但一旦达到 setTimeout,它就会连续调用该函数。我希望它在 18 秒后被调用。 如果 setTimmeout 中的时间少于 5 秒,则会立即发送响应,并且我收到“发送后无法设置标头”错误。
这里有 setInterval 和 setTimeout 导致我出现问题吗?请指导我。
【问题讨论】:
-
不清楚你想要什么逻辑。请用文字描述您想要的精确轮询逻辑。我也不清楚为什么你同时拥有
setInterval()和setTimeout()。当您尝试多次调用res.send()时,会导致“发送后无法设置标头”的问题。此外,importStatus是什么以及它与您的轮询逻辑有何关系。它没有在您显示的代码中定义或更改。 -
在我看来,如果
importStatus不是true,那么你永远不会清除你的setInterval()。它只会一直运行下去,一旦 pollCount > 15,你会在间隔计时器的每个滴答声上继续做res.sendStatus(500)。 -
我想投票直到结果为真。但如果超过一定数量,则不要投票。这就是我想要实现的。 importStatus 是 db 调用的结果。它提供值是真还是假。我无法弄清楚如何清洁它。我实际上不想同时使用 settimeout 和 setInterval。抱歉,代码不好。
-
在您显示的代码中
importStatus未定义,并且与您显示的sequelize.query()结果没有任何关系。事实上,您不会对这段代码中的数据库结果做任何事情。所以,我不明白你投票的目的是什么?这真的是所有相关代码吗?或者,你遗漏了什么? -
仅供参考,至少,您可能在某处缺少
clearInterval(processStatusCheck),因为如果importStatus永远不会出现true,那么即使您已经完成@,您也永远不会停止间隔987654335@.
标签: javascript node.js asynchronous settimeout setinterval