Javascript .bind()将在何时运行?
我正在尝试使用更改配置数据作为输入,安排一系列任务按时间间隔运行:Javascript .bind()将在何时运行?,javascript,node.js,callback,Javascript,Node.js,Callback,我正在尝试使用更改配置数据作为输入,安排一系列任务按时间间隔运行: 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);
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的语义中,上述函数是否会每隔一段时间重新绑定到最新的
configData
对象?在这种情况下什么时候会发生绑定?如果希望任务继续引用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
aconst
引用并使用Object.assign()
对结果
的键进行浅层复制,使用结果中的新值覆盖configData
中的每个键:
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);
由于bind()
没有包装在另一个函数中,因此它是同步执行的
任务函数绑定到原始configData
。如果使用configData=result
重新分配,这不会影响绑定函数
任务函数应使用函数包装以重新分配configData
:
setInterval(() => { taskA(configData) }, TASK_A_WAIT)
另一个使用bind
的选项是为configData
对象保留相同的引用,这仅在initialconfigData
是一个对象时才有效:
setInterval(refreshConfig.bind(null, (error, result) => {
...
Object.assign(configData, result);
}), CONFIG_REFRESH_WAIT);
如果configData
可能已经具有可能不会被覆盖的属性,则应该首先覆盖该属性。否,因为configData=result
覆盖的是引用,而不是值。任务仍将绑定到旧引用。@PatrickRoberts因此,如果我理解正确,绑定将只发生一次,但因为绑定是通过引用进行的,并且在每次刷新配置数据时,相应引用处的值都会更新,输入三个任务的configData
的值在每个时间间隔内都是最新的?绑定是按值。。。某种程度上。问题是您的configData
的引用正在更改,但是.bind()
将保留旧的引用。@PatrickRoberts因此,如果configData
是一个对象,因为引用将更改,它将无法工作。但是如果configData
不是对象,它会工作吗?介意写一个答案吗,这样我就可以投票了?不管configData
是什么,它都不会起作用。哈哈。没有向上看以确保其他人也没有做同样的事情。难怪,没有那么多的选项可以让它工作。实际上,这里有一些非常有趣的东西,我对javascript一无所知。const
关键字可用于生成具有可变值的常量引用?