Javascript setTimeout函数出现问题';s作为回调函数执行的函数中的变量
我试图在函数Javascript setTimeout函数出现问题';s作为回调函数执行的函数中的变量,javascript,callback,settimeout,Javascript,Callback,Settimeout,我试图在函数plotReglaFalsa中执行一些带有setTimeout的语句,该函数实际上作为回调函数在getSendingJSON(“/plot”,args,plotReglaFalsa) 这是由setTimeout执行语句的代码片段: for (series in respuesta) { if (series != "x" && series != "y" && series != "raiz") {
plotReglaFalsa
中执行一些带有setTimeout
的语句,该函数实际上作为回调函数在getSendingJSON(“/plot”,args,plotReglaFalsa)
这是由setTimeout
执行语句的代码片段:
for (series in respuesta) {
if (series != "x" && series != "y" && series != "raiz") {
setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].a,0])},1500)
setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].b,0])},1800)
c++
}
}
这里的问题是,一旦回调发生,respuesta和so系列实际上是存在的
当我尝试运行时,会得到以下控制台输出:
这是我的全部代码:
function plotReglaFalsa(respuesta) {
var result = []
result.push({
label: "fx",
color: "red",
data: _.zip(respuesta['x'], respuesta['y'])
})
for (series in respuesta) {
if (series != "x" && series != "y" && series != "raiz") {
result.push({
color: "blue",
data: [[]]
})
}
}
var plot = $.plot( $("#placeholder"),
result,
{ selection:{mode: "xy"},
zoom: { interactive: true },
pan: { interactive: true },
grid: { markings: [{ xaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 2 }, { yaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 2 }] }
})
plot.getOptions().selection.mode = null
var c = 1
for (series in respuesta) {
if (series != "x" && series != "y" && series != "raiz") {
setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].a,0])},1500)
setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].b,0])},1800)
c++
}
}
}
getSendingJSON("/plot",args,plotReglaFalsa)
function resaltarPuntos(plot,respuesta,series,c,x){
plot.highlight(c,[respuesta[series].x,0])
}
function desResaltarPuntos(plot){
plot.unhighlight()
}
getSendingJSON
实际上是AJAX。如何完成此操作?根据elclanrs的评论:
每次代码遍历for
循环时,它都会修改序列的值。因此,在调用setTimeout()
时,series
的值已更新为respuesta
中的最后一个值
您需要使用闭包,这样您的setTimeout()
就可以像在迭代过程中一样使用series
的值
您将函数传递给setTimeout()
,因此setTimeout()
将调用它们。但是他们不知道您想要的变量是什么,所以他们无法将它们传递给函数。定义函数参数不会以某种方式导致将它们传递给函数。将给您几个警告——“不要在循环中生成函数”…现代JS引擎将允许您将想要的数据直接传递到setTimeout
。比如:setTimeout(函数(respuesta,series){/*…*/},1500,respuesta,series)但是,代码>在较旧的浏览器中不起作用。@CookieMonester我使用的是最新版本的Firefox。只有从传递给setTimeout()
的匿名函数中删除参数,此功能才会起作用,其目的是通过将值分配给循环未更新的其他变量来避免闭包的后果。这就是匿名函数接收x
?@diegaoguilar yes的原因。循环中series的值被传递给x,然后该值可用于传递给setTimeout的函数。为每个函数在每个循环上创建一个新的x实例,避免了多次引用series的一个实例的后果。@DiegoaGuillar:需要从正在传递的函数中删除respuesta,x
参数,才能使此技术起作用<代码>设置超时(函数(){…
function plotReglaFalsa(respuesta) {
var result = []
result.push({
label: "fx",
color: "red",
data: _.zip(respuesta['x'], respuesta['y'])
})
for (series in respuesta) {
if (series != "x" && series != "y" && series != "raiz") {
result.push({
color: "blue",
data: [[]]
})
}
}
var plot = $.plot( $("#placeholder"),
result,
{ selection:{mode: "xy"},
zoom: { interactive: true },
pan: { interactive: true },
grid: { markings: [{ xaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 2 }, { yaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 2 }] }
})
plot.getOptions().selection.mode = null
var c = 1
for (series in respuesta) {
if (series != "x" && series != "y" && series != "raiz") {
setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].a,0])},1500)
setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].b,0])},1800)
c++
}
}
}
getSendingJSON("/plot",args,plotReglaFalsa)
function resaltarPuntos(plot,respuesta,series,c,x){
plot.highlight(c,[respuesta[series].x,0])
}
function desResaltarPuntos(plot){
plot.unhighlight()
}
for (series in respuesta) {
if (series != "x" && series != "y" && series != "raiz") {
(function(x){
setTimeout(function(){plot.highlight(c,[respuesta[x].a,0])},1500);
setTimeout(function(){plot.highlight(c,[respuesta[x].b,0])},1800);
c++;
}(series))
}
}