Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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
setTimeout无法使用javascript和svg_Javascript - Fatal编程技术网

setTimeout无法使用javascript和svg

setTimeout无法使用javascript和svg,javascript,Javascript,这是我的网站granite.sru.edu/~jaw1005/progress.php的url 问题是我有5个svg元素作为按钮,每个按钮都改变了图形 我想做一个类似这样的函数 function play(evt){ setTimeout(doButtons5(evt),3000) setTimeout(doButtons4(evt),3000) setTimeout(doButtons4(evt),3000) } 其目的是将数据中的更改显示为动画 当我点击调用play函数的黑色

这是我的网站granite.sru.edu/~jaw1005/progress.php的url

问题是我有5个svg元素作为按钮,每个按钮都改变了图形

我想做一个类似这样的函数

function play(evt){
  setTimeout(doButtons5(evt),3000)
  setTimeout(doButtons4(evt),3000)
  setTimeout(doButtons4(evt),3000)
 }
其目的是将数据中的更改显示为动画

当我点击调用play函数的黑色圆圈时,什么都没有发生,因此任何帮助都会受到极大的欢迎

下面是一段代码,我不知道它是否有用

function doButtons5(evt){
    http5.open('get',"http://granite.sru.edu/~jaw1005/getdata5.php");
    http5.onreadystatechange = getData5;
    http5.send(null);

}

function getData5(){
   if(http5.readyState == 4){
     sampsonnnn=http5.responseText
     doSVGStuff5(sampsonnnn)

}

}

根据window.setTimeout文档,您必须像这样使用超时:

function play(evt){
  setTimeout(doButtons5,3000)
  setTimeout(doButtons4,3000)
  setTimeout(doButtons4,3000)
 }

您将同步模式与异步函数混合。我可以推荐的第一件事是使用一个好的异步模式库,比如或至少是。原因是代码可读性和编码人员的理智

当您调用像
doButtons5(evt)
这样的函数时,它会立即执行,该调用的返回值将传递给
setTimeout
。根据OP的例子,我推断这不是期望的愿望。我基于使用传入的
evt
变量,当
setTimeout
最终调用回调时,如果在
play
函数之外引用该变量,则该变量将不存在。示例
doButton5
没有使用传递的变量
evt
是否您需要保留对该对象的引用?我将假设情况就是这样,并展示如何使用部分应用程序来促进这样的工作

另外,
doButton5
示例看起来使用的是一种XHR形式,它也是异步的。因此,延迟执行不需要
setTimeout

部分应用 这将返回一个新函数,该函数在闭包中绑定了
evt
变量

setTimeout的帮助程序 接下来,我们需要链接
setTimeout
s,为了方便起见,让我们为此编写一个帮助函数

function asyncFns() {
  // We could pass an array but for now this is good enough.
  var funcs = Array.prototype.slice.call(arguments, 0);
  var timeout = 3000;

  for (var i = 0; i < func.length; i++) {
    setTimeout(funcs[i], timeout);
  }
}

您正在立即执行
doButtons5
,并将返回值传递给
setTimeout
,该值是
未定义的。您必须将函数传递给
setTimeout
。请阅读文档:。老兄,我有时会觉得自己很笨吗,非常感谢你的帮助。这就是你要找的吗?
function asyncFns() {
  // We could pass an array but for now this is good enough.
  var funcs = Array.prototype.slice.call(arguments, 0);
  var timeout = 3000;

  for (var i = 0; i < func.length; i++) {
    setTimeout(funcs[i], timeout);
  }
}
function play(evt) {
  asyncFns(
    bindEvt(doButtons5, evt),
    bindEvt(doButtons4, evt),
    bindEvt(doButtons4, evt)
  );
}