我读StackOverflow上的答案在这里解释了如何使用的setTimeout来创造一种在网页上反复循环。但是,我想知道为什么 setTimeout 需要匿名函数才能工作。考虑以下代码:
trainingTimer(60,0);
function trainingTimer(duration,c) {
document.getElementById("timer").innerHTML = "Time left: "+(duration-c);
if(duration==c) {
alert("Time is up!");
}
else {
window.setTimeout(trainingTimer(duration,c+1),1000);
}
}
Run Code Online (Sandbox Code Playgroud)
我是根据上面链接的答案写的,但是当它运行时,它会trainingTimer一次遍历所有 60 个调用,并立即在我的网页上显示“剩余时间:0”。但是,如果我修改
window.setTimeout(trainingTimer(duration,c+1),1000);
并trainingTimer(duration,c+1)像这样包装一个匿名函数
window.setTimeout(function() {trainingTimer(duration,c+1)},1000);
那么代码工作得很好。
我想知道为什么我必须将命名函数包装在匿名函数中才能使 setInterval 正常工作。感谢所有的帮助。
我正在阅读一些使用 Promise 对象的代码。
有一个setTimeout带有三个参数的函数,我想知道第三个参数是做什么的?因为通常它只有两个参数。
代码如下:
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms , 'done');
});
}
timeout(1000).then(value => {
console.log(value);
});
Run Code Online (Sandbox Code Playgroud)
我注意到第三个参数被传递给了函数resolve,但是为什么我可以在函数中使用它then?它是如何工作的?
我正在尝试开发幻灯片,幻灯片之间有暂停.所以我正在尝试使用setTimeout语句,如下所示.这是写入交换2.jpg为1.jpg,点击按钮暂停10秒.但现在确实有效.谁能帮我.谢谢.
<html>
<head>
<script type="text/javascript">
var t;
function swap(newImage) {
var fileName=newImage.toString()+".jpg"
document.slideshow.src=fileName
t=setTimeout("swap()",10000)
}
</script>
</head>
<body>
<img name="slideshow" src="1.jpg" width="450" height="335" />
<br /><br />
<input type="button" onClick="swap('2')" value="Change image" />
<br /><br />
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我在谷歌地图代码中处理这个问题,但它实际上是一个架构问题.在某些时候因为这么多的请求谷歌地图限制了响应,并且在那一点上我想要延迟做另一个请求,但是当我再次调用function2时它说"数组未定义".
function1() {
var array = JSON.parse(xmlhttp.responseText);
for (i; i < length; < i++) {
function2(array[i].one, array[i].two);
}
function3() {
//render directions
}
function2(start, end) {
directionsService.route({
origin: start,
destination: end,
},
function (result, status) {
if (status == google.maps.DirectionsStatus.OK)
function3(result);
else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT)
var functionStr = "function2(array[i].one" + ',' + "array[i].two)";
setTimeout(functionStr, 5000);
});
}
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个长轮询脚本并遇到一个too much recursion挂起浏览器的错误.我的目标是每1000ms使用相同的功能setTimeout().是的,我可以使用,setInterval()但它将是一个长轮询脚本,并将等待服务器响应.
我通过删除()我在同一个函数中调用的函数来解决这个问题.
我的脚本看起来像:
function messagePolling(){
console.log("polled")
setTimeout(messagePolling(),1000) // <--- removing `()` from the function works as intended
}
messagePolling();
Run Code Online (Sandbox Code Playgroud)
这背后的逻辑是什么?messagePolling毕竟不是它的功能.
setTimeout下面是同步代码之后执行的例子
console.log('hello');
setTimeout(() => console.log('timeout'), 0);
console.log('end');
Run Code Online (Sandbox Code Playgroud)
控制台输出:hello end timeout
异步:
function asyncForEach(array, callBack) {
array.forEach(x => setTimeout(callBack(x), 0));
}
asyncForEach([1,2,3,4], (i) => console.log(i));
console.log('end');
Run Code Online (Sandbox Code Playgroud)
控制台输出:
1
2
3
4
end
Run Code Online (Sandbox Code Playgroud)
同步:
[1,2,3,4].forEach(x => console.log(x));
console.log('end');
Run Code Online (Sandbox Code Playgroud)
控制台输出:
1
2
3
4
end
Run Code Online (Sandbox Code Playgroud)
我试图更好地理解event loop和task queue,并且在观看了一个很好的推荐视频(https://www.youtube.com/watch?v=8aGhZQkoFbQ)后,遇到了以下半声明:“回调可以是同步和异步的”。演讲者继续演示同步方式如何最终不会通过task queue,因此不会通过event loop,因此所有内容都保留在stack. 但是,异步方式会导致task queue用 的最终返回填充setTimeout callback,这将使任何同步的下面代码可执行,因为event loop必须等待一个空stack来插入返回的callback.
运行上面的代码时(我从他那里偷来的东西也编辑过,所以这可能是我的错误添加),异步方式产生与同步方式相同的结果。
有人可以帮助解释为什么异步方式不作为第一个setTimeout示例和/或提供解释如何不将常规回调(例如数组帮助程序方法)插入task …
在java脚本中执行某些功能之前我需要延迟.我可以使用setTimeout,但问题是我有两个传递给函数的变量.在这种情况下我需要setTimeout的语法.任何人都可以帮忙吗?
javascript ×7
es6-promise ×1
event-loop ×1
google-maps ×1
jquery ×1
setinterval ×1
settimeout ×1
task-queue ×1