Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript .bind()将在何时运行?_Javascript_Node.js_Callback - Fatal编程技术网

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
a
const
引用并使用
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
对象保留相同的引用,这仅在initial
configData
是一个对象时才有效:

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
关键字可用于生成具有可变值的常量引用?