Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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
Javascript JS-如何正确使用setTimeout()_Javascript_Node.js - Fatal编程技术网

Javascript JS-如何正确使用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

因此,我有一个在setTimeout上执行的函数,console.log为我命名的time变量返回正确的值,但是当我运行代码时,该函数没有延迟地运行。代码是我正在制作的一个游戏的服务器端。该代码应该在使用物品后逐渐恢复玩家的健康。我的问题是settimeout函数。。。当我在浏览器中使用它而不是在节点控制台中使用它时,它也可以工作

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