Javascript JS-如何正确使用setTimeout()
因此,我有一个在setTimeout上执行的函数,console.log为我命名的time变量返回正确的值,但是当我运行代码时,该函数没有延迟地运行。代码是我正在制作的一个游戏的服务器端。该代码应该在使用物品后逐渐恢复玩家的健康。我的问题是settimeout函数。。。当我在浏览器中使用它而不是在节点控制台中使用它时,它也可以工作Javascript JS-如何正确使用setTimeout(),javascript,node.js,Javascript,Node.js,因此,我有一个在setTimeout上执行的函数,console.log为我命名的time变量返回正确的值,但是当我运行代码时,该函数没有延迟地运行。代码是我正在制作的一个游戏的服务器端。该代码应该在使用物品后逐渐恢复玩家的健康。我的问题是settimeout函数。。。当我在浏览器中使用它而不是在节点控制台中使用它时,它也可以工作 function balm(i){ this_sql ="UPDATE game_moblist SET hp = least(max_hp, hp +"+M
function balm(i){
this_sql ="UPDATE game_moblist SET hp = least(max_hp, hp +"+Math.round(i/2)+") WHERE id ="+mobid;
connection.query(this_sql, function(err, rows, fields) {
if (err) err=null
});
console.log(this_sql);
this_sql = "SELECT hp, max_hp FROM game_moblist WHERE id ="+mobid; //emite catch all update pointint to hp..
connection.query(this_sql, function(err, rows, fields) {
if (err) throw err;
socket.emit ('updatemisc',handler,rows);//eval handler using args
if (rows[0].hp==rows[0].max_hp){
i=0;
return i;
}
});
}
for (i=30;i>=0;i--){
time=(31-i)*1000;
console.log(time);
setTimeout(balm(i),time);
}
这是setTimeout的正确用法
setTimeout(balm, time, i);
您必须先传递一个函数,然后是delay,然后是args到前面提到的函数问题在于:
setTimeout(balm(i),time);
它所做的是调用balm,并将其返回值输入到setTimeout,这不是您想要的。您希望传递setTimeout
一个函数,该函数在被调用时将使用给定的i
值调用balm
。你是这样做的:
setTimeout(makeHandler(i),time);
function makeHandler(index) {
return function() {
balm(index);
};
}
这样,balm
函数将在稍后调用,并在计划超时时使用i
值调用。如果没有makeHandler
东西,所有balm
实例都会像运行时一样看到i
(例如,它们都会看到-1
)。这是因为在JavaScript中,闭包可以持久地访问上下文中的变量;在创建闭包时,没有它们的副本。所以它们都可以看到i
的当前值。(更多:)
(请注意,在NodeJS(您正在使用的环境)和Firefox上,您可以使用setTimeout
的非标准扩展,允许您提供参数以传递给函数;请参阅。但是对于希望在web上实现此功能的任何人[而不是使用节点的服务器端],注意,这不是标准。)
为了说明这一点,这里有一个示例(这个示例在浏览器中运行,但对于服务器端的东西(如NodeJS)也是如此):
(函数(){
//错
setTimeout(函数(){
var i;
对于(i=0;i<5;++i){
setTimeout(函数(){
显示(“错误”,i);
},i*50);
}
}, 0);
//对
setTimeout(函数(){
var i;
对于(i=0;i<5;++i){
setTimeout(makeHandler(i),i*50);
}
函数makeHandler(索引){
返回函数(){
显示(“右”,索引);
};
}
}, 500);
功能显示(标记,val){
显示(“显示(“+marker+”):+val);
}
功能显示(msg){
var p=document.createElement('p');
p、 innerHTML=字符串(msg);
文件.正文.附件(p);
}
})();
|
以下是输出:
show (wrong): 5
show (wrong): 5
show (wrong): 5
show (wrong): 5
show (wrong): 5
show (right): 0
show (right): 1
show (right): 2
show (right): 3
show (right): 4
显示(错误):5
显示(错误):5
显示(错误):5
显示(错误):5
显示(错误):5
显示(右):0
表演(右):1
表演(右):2
表演(右):3
show(right):4需要注意的是,这只在NodeJS(和Firefox)中正确。向
setTimeout
传递附加参数的功能在不同环境中不是标准功能,在客户端也不起作用。但这是真的,所以+1。@user1481372:恕我直言,我的答案是有效的。但绝对地,pksunkara的答案在您使用的环境中运行良好。Crowder很好地描述了setTimeout的工作原理@用户1481372,你应该读一下。这里的编辑很棒。不是很明显,i
不是每次传递的值,而是函数实际运行时的值。你的makeHandler
解决了这个问题。如果我可以的话,我会再次+1这个答案。。。
show (wrong): 5
show (wrong): 5
show (wrong): 5
show (wrong): 5
show (wrong): 5
show (right): 0
show (right): 1
show (right): 2
show (right): 3
show (right): 4