Я столкнулся с проблемой с функцией setTimeout: она не отражает обновленное значение переменной.
Вот упрощенная версия моего кода:
const handleProcessError = (processName, process) => {
let responseTimeout;
let responseAlreadySent = false;
const sendResponse = (status, message, scan_id, scantype, error) => {
if (!responseAlreadySent) {
responseAlreadySent = true;
clearTimeout(responseTimeout);
if (status === 'Success') {
console.info('Sending success response', responseAlreadySent);
res.status(200).json({ status, message });
} else {
console.info('Sending error response', responseAlreadySent);
res.status(500).json({ status, message });
revertScanAndThrowError(error, processName);
}
} else {
console.info('Response already sent, skipping');
}
};
responseTimeout = setTimeout(() => {
sendResponse('Success', 'The scan started', inc_val, scantype);
}, 5000);
let errorOutput = '';
process.stderr.on('data', (data: Buffer) => {
errorOutput += data.toString();
});
process.on('exit', (code: number, signal: NodeJS.Signals) => {
if (code !== 0) {
sendResponse('Error', 'Failed to start the scan', null, null, new Error(`Process exited with code ${code}. Error output: ${errorOutput}`));
} else {
console.info(`${processName} process exited with code 0`);
}
});
// Other event listeners and handlers...
};
В этом коде handleProcessError устанавливает функцию тайм-аута, используя setTimeout. При возникновении ошибки он вызывает sendResponse, который обновляет флаг responseAlreadySent до значения true. Однако функция таймаута по-прежнему выполняется, хотя флаг был обновлен, что приводит к неожиданному поведению.




![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это проблема масштаба. Каждый раз, когда sendResponse запускается, он видит свою собственную версию responseAlreadySent. Вы можете исправить это, объявив переменную в области, находящейся за пределами handleProcessError. Вот упрощенная версия, показывающая это
var responseAlreadySent = false;
const handleProcessError = (processName, process) => {
let responseTimeout;
const sendResponse = () => {
console.info(responseAlreadySent);
if (!responseAlreadySent) {
responseAlreadySent = true;
clearTimeout(responseTimeout);
console.info('Sending response');
} else {
console.info('Response already sent, skipping');
}
};
responseTimeout = setTimeout(() => {
sendResponse();
}, 5000);
// Other event listeners and handlers...
};
Может быть,
handleProcessErrorвызывается несколько раз?