js如何判断某个函数是不是执行完?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js如何判断某个函数是不是执行完?相关的知识,希望对你有一定的参考价值。
changeMsg();
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">
inputwidth: 100px;height: 30px;
divwidth: 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>
参考技术A 在JS代码中,其实本身是线性执行的,但是如果使用有函数的情况下,这种线性执行被打破了。比如其一个函数执行完毕后才允许另外一些语句的执行,这种情况下顺序写的代码并不等待函数执行完毕,除非那个函数能在一个时间片中完成!出现这种情况下我们可以让JS进行等待,等待到特定的时间后再去转去执行另外的一些语句,也就是说我们使用settimeout等待到一定的时间后去执行,这种能解决一些问题的!
但新的问题也出来了,就是等待的时间不确定,可能等到一定的时间时该函数还没有完全执行,而函数外程序又是无法感知,怎么办?新的办法就是查询,这种方式能解决时间等待的问题!而我们使用时又不想让计算机一直运行,那么setinterval则是一个不错的选择,或者使用settimeout函数内自身调用的方式。
其实这种情况下已经能解决很大的一部分问题了,便是如果是一个无返回的函数怎么办?外部无法感知函数自身是否执行完毕,其实在函数运行的出口处(出口也可能有多个)对一个全局的值进行一次生新的设置,也就是让函数主动报告是否已经完成。
这种情况下其实也是很吓人的,在你运行的程序中会多出一个参数来指示某个函数是否执行完毕,这事说起不有点吓人,万一哪天看这个参数没用,直接给删除了倒不是很妙的事,一些完美主义的人便想到了利用JS模拟OOp的方式,也就是说写成一个对象的方式,直接去查询查个对象的一个属性,这个对象的属性不会被轻易删除的!但其实作用是一样的!
那么,即然不能外部不能感知函数是否运行完毕,那么,函数自己总知道自己运行完毕了吧?而且循环查询有一个特点:设置时间长了是在浪费时间,设置时间短了,是在浪费CPU时间片,怎么才能不流费呢?
那么,为什么不将要后边执行的语句写成一个函数,然后,让那个运行函数出口时直接调用呢?其实这样才是最省事,最省时的方法,那么,一个函数在调用完毕后,也就是即将退出函数运行时,去执行你要调用的语句不就可以了?
嗯,这种方法一般也很常用,可能你还会觉得非常常好用,但他也是有缺点的——如果那个运行时间较长的函数的出口点不只一个,有多少我也不知道?每个出口点都要加上,这样又不太合算了!除非那那个函数的出口点设置为只有一个,否则这事还真有点难办呢!
那么,一些程序反倒不太适合用这种方法,虽然说这种方法是绝对的性能与时间都不浪费的方法,假定哪天你不小心改了一下函数名,那么调用这个函数的出口点都必须跟着改过来完,否则你自己想结果。我先承认一点就是虽然可以用查找替换的方式,但是,真的不太好,可能会替换其他函数,如你改的函数是play(),但里边还有一个meplay(),一不小心就会将meplay()改成一个什么玩意都不是的东西——你可以说你的文件中不会出现这种情况——但完美主义者却不这么认为,那么还有没有更好的方法呢?
于是想到了OOP,何不将其利用OOP进行组合一下呢——这就涉及到了商业代码的利益了。
反正方法我是说了,但是怎么写成那样的代码,你自己看着来吧!
不过你现在可以将后两边句直接影响写在你的函数后边,当一个函数执行不就可了?多加一个方法的可能性都不要的!但如果有两个出口点就不一样了,如果更多,那你只有想更多的办法。至于代码么——那是思考之后的东西,我很少写。 参考技术B 不是很明白你的意思。
判断函数是否执行完毕,你可以看看函数是否有返回值啊。
在判断语句的代码块中没有直接return的情况下。
只要接收到了函数的返回值。
那么函数就是已经执行完了所有代码的。 参考技术C 给 函数 做一个返回值 然后判断返回值 就行了追问
能不能把这两段代码改改?不太明白你的意思
追答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);
我按你生面的来不行啊,于是改成返回0或者1结果还是不行...没有执行那两句
追答慢慢调试 吧
追问不行...调试的时候return之后直接回到本函数继续执行了....
追答setTimeout("closeMsg()",30);是你这段代码惹的祸 不知道你要干嘛
参考技术D 把document.getElementById("msgdiv").appendChild(thObj);
document.getElementById("msgdiv").appendChild(bodyObj);
这两个放到changeMsg()函数的里面。。。。追问
不能放...这个说起来比较复杂了...确实不能放
追答其实你这样写本来就是changeMsg()执行完再执行下面的东西的。因为是一个线程内顺序执行
追问能实现我要的效果?
追答1:changeMsg();
2:document.getElementById("msgdiv").appendChild(thObj);
3:document.getElementById("msgdiv").appendChild(bodyObj);
这个本来就是按照1,2,3顺序执行的,不可能存在1运行的时候同时运行2,3
算了...我可以告诉你,你错了...
追答那你能changeMsg这个函数的代码帖出来让我们欣赏下吗?
以上是关于js如何判断某个函数是不是执行完?的主要内容,如果未能解决你的问题,请参考以下文章