我正在尝试使用更改配置数据作为输入来安排一堆任务按时间间隔运行:

let 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 configData = result;
}), CONFIG_REFRESH_WAIT);

目标是使用最后一个setInterval()定期更新配置数据,以便前三个setInterval()始终具有最新数据。但这行得通吗?

在javascript的语义中,以上内容实际上会在每个时间间隔内将函数重新绑定(bind)到最新的configData对象吗?在这种情况下何时会发生绑定(bind)?

最佳答案

由于bind()没有包装在另一个函数中,因此它在原位同步执行。

任务功能绑定(bind)到原始configData。如果使用configData = result进行了重新分配,则这不会影响绑定(bind)的函数。

任务函数应使用函数包装,以重新分配configData:

setInterval(() => { taskA(configData) }, TASK_A_WAIT)

可以与bind一起使用的另一个选项是为configData对象保留相同的引用,这仅在初始configData是一个对象时才有效:
setInterval(refreshConfig.bind(null, (error, result) => {
  ...
  Object.assign(configData, result);
}), CONFIG_REFRESH_WAIT);

如果有可能configData已经具有可能不会被覆盖的属性,则应首先设置cleared

09-11 14:53