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如何判断某个函数是不是执行完?的主要内容,如果未能解决你的问题,请参考以下文章

js判定是不是传入回调函数

JS怎么判断异步是不是执行完成

如何让vuejs中ready函数加载完之后执行某个函数

js函数执行顺序,怎麼让一个函数执行完再执行下面的程序

js中如何判断数组中是不是含有某一项

JS如何判断一个数组是不是为空、是不是含有某个值