Если вы хотите, чтобы задачи продолжали ссылаться на живую версию configData
, вы должны передавать анонимную функцию-обертку для каждого из вызовов для setInterval()
, например, которая ограничивает ссылку на символическую переменную, а не привязывает оригиналссылка на объект для каждой функции:
let configData = initConfig(); // Initialize configuration data from file
setInterval(() => taskA(configData), TASK_A_WAIT); // Task using config data
setInterval(() => taskB(configData), TASK_B_WAIT); // Task using config data
setInterval(() => taskC(configData), TASK_C_WAIT); // Task using config data
setInterval(refreshConfig.bind(null, (error, result) => { // Update config data
if (error) handleError(error);
else configData = result;
}), CONFIG_REFRESH_WAIT);
В качестве альтернативы, если вы не хотите, чтобы ссылка изменялась, и вы знаете, что структура конфигурации никогда не изменится, вы можете предпочесть configData
a * 1007.* ссылаться и использовать Object.assign()
для создания мелкой копии ключей result
, перезаписывая каждый ключ в configData
новыми значениями в result
:
const configData = initConfig(); // Initialize configuration data from file
setInterval(taskA.bind(null, configData), TASK_A_WAIT); // Task using config data
setInterval(taskB.bind(null, configData), TASK_B_WAIT); // Task using config data
setInterval(taskC.bind(null, configData), TASK_C_WAIT); // Task using config data
setInterval(refreshConfig.bind(null, (error, result) => { // Update config data
if (error) handleError(error);
else Object.assign(configData, result);
}), CONFIG_REFRESH_WAIT);