js如何判断某个函数是否执行完?
document.getElementById("msgdiv").appendChild(thObj);
document.getElementById("msgdiv").appendChild(bodyObj);
changeMsg是个时间比较长的函数,我想等它执行完之后再执行下面的代码,但是如何判断它是否执行完呢?
改成这样还不行:
if(changeMsg()==1){
GetId("msgdiv").appendChild(thObj);
GetId("msgdiv").appendChild(bodyObj);}
function changeMsg()
{
$("msgdiv").style.width=parseInt($("msgdiv").style.width)+ 20+"px";
$("msgdiv").style.height=parseInt($("msgdiv").style.height)+ 15+"px";
if(parseInt($("msgdiv").style.width)<200)
{
setTimeout("changeMsg()",30);
}
else
{
//fd=1;
//AlertMsg(etitle,econtent,ename);
return 1;
}
return 0;
}
GetId和$是同一个函数,意思就是document.getElementById 展开
给函数做一个返回值,然后判断返回值就行了。
function closeMsg()
{
var retVal=false;
$("msgdiv").style.width=parseInt($("msgdiv").style.width)- 20+"px";
$("msgdiv").style.height=parseInt($("msgdiv").style.height)- 15+"px";
if(parseInt($("msgdiv").style.width)<=0)
{
document.body.removeChild(GetId("msgdiv"));
document.body.removeChild(GetId("maskdiv"));
retVal=true;
}
else
{
setTimeout("closeMsg()",30);
}
return retval;
}
if(changeMsg()){
document.getElementById("msgdiv").appendChild(thObj);
document.getElementById("msgdiv").appendChild(bodyObj);
}
扩展资料:
event.result这个属性包含了当前事件事件最后触发的那个处理函数的返回值
如果为DOM元素的同一事件类型绑定了多个事件处理函数,你可以使用result属性获取上一个事件处理函数执行的返回值。
<!DOCTYPE html>
<html>
<style>
</style>
<head>
<meta charset="UTF-8">
<title>演示文档</title>
<script type="text/javascript" src="jquery-3.1.1.min.js"></script>
<style type="text/css">
input{width: 100px;height: 30px;}
div{width: 100px;height: 100px;border:1px solid green;}
</style>
</style>
</head>
<body>
<h3>jQuery事件对象</h3>
<div id="div1"><p id="pid"></p></div>
<input id="btn1" type="button" value="事件对象">
<script type="text/javascript">
$(function(){
$('#btn1').click(function(){
// return 100
return true
})
$('#btn1').click(function(e){
// alert(e.result)
if (e.result) {
alert('进入下一关!')
}else{
alert('Game Over!')
}
})
})
</script>
</body>
</html>
出现这种情况下我们可以让JS进行等待,等待到特定的时间后再去转去执行另外的一些语句,也就是说我们使用settimeout等待到一定的时间后去执行,这种能解决一些问题的!
但新的问题也出来了,就是等待的时间不确定,可能等到一定的时间时该函数还没有完全执行,而函数外程序又是无法感知,怎么办?新的办法就是查询,这种方式能解决时间等待的问题!而我们使用时又不想让计算机一直运行,那么setinterval则是一个不错的选择,或者使用settimeout函数内自身调用的方式。
其实这种情况下已经能解决很大的一部分问题了,便是如果是一个无返回的函数怎么办?外部无法感知函数自身是否执行完毕,其实在函数运行的出口处(出口也可能有多个)对一个全局的值进行一次生新的设置,也就是让函数主动报告是否已经完成。
这种情况下其实也是很吓人的,在你运行的程序中会多出一个参数来指示某个函数是否执行完毕,这事说起不有点吓人,万一哪天看这个参数没用,直接给删除了倒不是很妙的事,一些完美主义的人便想到了利用JS模拟OOp的方式,也就是说写成一个对象的方式,直接去查询查个对象的一个属性,这个对象的属性不会被轻易删除的!但其实作用是一样的!
那么,即然不能外部不能感知函数是否运行完毕,那么,函数自己总知道自己运行完毕了吧?而且循环查询有一个特点:设置时间长了是在浪费时间,设置时间短了,是在浪费CPU时间片,怎么才能不流费呢?
那么,为什么不将要后边执行的语句写成一个函数,然后,让那个运行函数出口时直接调用呢?其实这样才是最省事,最省时的方法,那么,一个函数在调用完毕后,也就是即将退出函数运行时,去执行你要调用的语句不就可以了?
嗯,这种方法一般也很常用,可能你还会觉得非常常好用,但他也是有缺点的——如果那个运行时间较长的函数的出口点不只一个,有多少我也不知道?每个出口点都要加上,这样又不太合算了!除非那那个函数的出口点设置为只有一个,否则这事还真有点难办呢!
那么,一些程序反倒不太适合用这种方法,虽然说这种方法是绝对的性能与时间都不浪费的方法,假定哪天你不小心改了一下函数名,那么调用这个函数的出口点都必须跟着改过来完,否则你自己想结果。我先承认一点就是虽然可以用查找替换的方式,但是,真的不太好,可能会替换其他函数,如你改的函数是play(),但里边还有一个meplay(),一不小心就会将meplay()改成一个什么玩意都不是的东西——你可以说你的文件中不会出现这种情况——但完美主义者却不这么认为,那么还有没有更好的方法呢?
于是想到了OOP,何不将其利用OOP进行组合一下呢——这就涉及到了商业代码的利益了。
反正方法我是说了,但是怎么写成那样的代码,你自己看着来吧!
不过你现在可以将后两边句直接影响写在你的函数后边,当一个函数执行不就可了?多加一个方法的可能性都不要的!但如果有两个出口点就不一样了,如果更多,那你只有想更多的办法。至于代码么——那是思考之后的东西,我很少写。
判断函数是否执行完毕,你可以看看函数是否有返回值啊。
在判断语句的代码块中没有直接return的情况下。
只要接收到了函数的返回值。
那么函数就是已经执行完了所有代码的。
能不能把这两段代码改改?不太明白你的意思
function closeMsg()
{
var retVal=false;
$("msgdiv").style.width=parseInt($("msgdiv").style.width)- 20+"px";
$("msgdiv").style.height=parseInt($("msgdiv").style.height)- 15+"px";
if(parseInt($("msgdiv").style.width)<=0)
{
document.body.removeChild(GetId("msgdiv"));
document.body.removeChild(GetId("maskdiv"));
retVal=true;
}
else
{
setTimeout("closeMsg()",30);
}
return retval;
}
if(changeMsg()){
document.getElementById("msgdiv").appendChild(thObj);
document.getElementById("msgdiv").appendChild(bodyObj);
}
document.getElementById("msgdiv").appendChild(thObj);
document.getElementById("msgdiv").appendChild(bodyObj);
这两个放到changeMsg()函数的里面。。。。
不能放...这个说起来比较复杂了...确实不能放
其实你这样写本来就是changeMsg()执行完再执行下面的东西的。因为是一个线程内顺序执行