Javascript函数setTimeout和setIntervall不起作用
Javascript function setTimeout and setIntervall not working
我在这里遇到了这个问题,这个函数不工作,我不知道为什么…这个函数应该计数到10(10秒内)。为此,我使用一个带有setTimeout函数的For循环-持续时间设置为1000ms。
对于我取的setInterval函数,它应该继续下去。
function timer() {
var time=10;
for(i=0; i<time; i++){
setTimeout(console.log(i+1), 1000);
}
}
setInterval(timer, 10000);
问题是,它不起作用,我不明白为什么……我已经找到了另一个可行的解决方案,但我想知道这个解决方案的问题。:) 似乎没有发生任何事情的原因是您使用setTimeout
的方式。不是提供事件处理程序,而是调用console.log
并尝试使用该调用的返回值作为事件处理程序。
最接近的方法是创建一个调用console.log
的函数:
setTimeout(function(){ console.log(i+1) }, 1000);
但是,您将注意到它一次只记录值11
十次,每十秒一次,无限期。
尽管循环计数从0到9,但您在每次迭代中启动一个超时,该超时将在创建后一秒触发。由于所有10个超时都是同时创建的,因此它们将同时被触发。对于每个处理程序,没有单独的变量i
,因此它们都将在触发它们时显示变量中的值,并且由于在调用它们中的任何一个之前循环已经完成,它们都将显示最终值10 + 1。
如果您同时使用了间隔和超时,您应该使用其中一个。
你可以在循环中启动超时,但你应该只做一次,而不是间隔,你应该指定从开始到你想要触发它的时间:
var time = 10;
for (var i = 1; i <= time; i++){
setTimeout(function() { console.log('tick'); }, 1000 * i);
}
如果您想在事件处理程序中使用该变量,那么您需要为每次迭代创建该变量的副本:
var time = 10;
for (var i = 1; i <= time; i++){
(function(copy){
setTimeout(function() { console.log(copy); }, 1000 * i);
})(i);
}
你可以使用间隔,但这样你就没有循环了,间隔才是循环。当到达循环结束时,使用clearInterval
停止它:
var i = 1, time = 10, handle;
function timer() {
console.log(i);
i++;
if (i > time) clearInterval(handle);
}
handle = setInterval(timer, 1000);
首先,它不工作,因为setTimeout调用是错误的。即使你的setTimeout调用有效,这里还有另一个问题。你的代码实际上会每10秒打印11。
function timer() {
var time = 10;
for (i = 0; i < time; i++) {
setTimeout(function() {
console.log(i + 1)
}, 1000);
}
}
setInterval(timer, 10000);
因为,你每秒钟都有顺序的setTimeout调用,你正在对变量i
形成一个闭包。
你需要注意闭包,调用必须在第二个打印完成后进行。
function timer() {
var p = Promise.resolve();
for (var i = 0; i < 10; i++) {
p = p.then(closure(i));
}
}
function closure(i) {
return (function () {
return new Promise(function (resolve) {
setTimeout(function () {
document.getElementById('results').innerHTML = (i + 1) + ''n';
resolve();
}, 1000);
})
});
}
timer();
setInterval(timer, 10000);
<pre id="results"></pre>
当我在Firebug调试器中运行代码时,我看到:
TypeError: can't convert console.log(...) to string
我在你的代码中添加了一个关于这个错误的注释:
function timer() {
var time=10;
for(i=0; i<time; i++){
// The source of error is the line below
// Type error: setTimeout needs a function as first argument!
setTimeout(console.log(i+1), 1000);
}
}
setInterval(timer, 10000);
正确的版本可能是
function timer() {
var time=10;
for(i=0; i<time; i++){
setTimeout(function() { console.log(i+1); }, 1000);
}
}
setInterval(timer, 10000);
然而,上面的修改修复了类型错误,但没有修复逻辑。
你可能想这样做:
var counter = 0;
var count = function() {
console.log(++counter);
if (counter >= 10) {
clearInterval(timer);
}
};
var timer = setInterval(count, 1000);
一旦回调函数count
注意到计数器传递的值为10,它将在设置时停止ID保存在变量timer
中的周期性计时器。
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 监视函数从服务返回不起作用,但作用域函数起作用
- 幻灯片滚动javascript不起作用
- 简单的javascript在Shopify中不起作用
- Recaptcha在IE7和IE8中不起作用
- Ember Data DS.Model's set函数不起作用
- JsFiddle上的鼠标事件不起作用
- 我的AngularJS表达式没有'不起作用
- 点击按钮输入不起作用
- 面向对象的Javascript代码在IE7中不起作用
- 分部隐藏在jquery中不起作用
- 在phonegap应用程序内部重定向不起作用
- Array.length似乎不起作用;console.log则显示其他情况
- $ionicplatform内的$scope不;不起作用
- 我的javascript for循环不起作用
- Meteor-添加用户自定义字段的方法不起作用
- 为什么 .focus() 不起作用,而 .css(“color”,“red”) 在同一个选择器上起作用
- Textarea必需的attribut在javascript中不起作用
- Javascript函数setTimeout和setIntervall不起作用
- Javascript的setIntervall不起作用