兩個(gè)函數(shù)相互調(diào)用如何防止死循環(huán)
兩個(gè)函數(shù)相互調(diào)用防止死循環(huán)
最近碰到了一個(gè)問(wèn)題,就是兩個(gè)函數(shù)相互調(diào)用遭遇死循環(huán)的問(wèn)題,想了半天終于想出了一個(gè)算法破解,姑且叫它熵遞減算法。
問(wèn)題的抽象代碼如下
/*
* ?methodA 和 methodB 循環(huán)調(diào)用,是死循環(huán)
* */
function methodA() {
? ? console.log('A的事情');
? ? methodB();
}
function methodB() {
? ? console.log('B的事情');
? ? methodA();
}不論調(diào)用哪個(gè)方法,都會(huì)產(chǎn)生死循環(huán)。
我想要的效果是:
如果觸發(fā)A方法時(shí),也執(zhí)行一下B方法,到此為止不再循環(huán)下去,反之亦然。
因此,必須能判斷方法是主動(dòng)發(fā)起的,還是被動(dòng)的。
抽象代碼如下:
/*
* ?解決問(wèn)題的關(guān)鍵在于,判斷方法是主動(dòng)發(fā)起的,還是被動(dòng)的
* */
function methodA() {
? ? console.log('A的事情');
? ? if('A是主動(dòng)的'){
? ? ? ? methodB();
? ? }else{
?? ??? ?// 不再調(diào)用下去
?? ?}
}
function methodB() {
? ? console.log('B的事情');
? ? if('B是主動(dòng)的'){
? ? ? ? methodA();
? ? }else{
?? ??? ?// 不再調(diào)用下去
?? ?}
}解法,就是熵遞減算法,如下
/*
* 熵遞減算法
* */
var pairMethodStep = 2;
function methodA() {
? ? pairMethodStep --;
? ? console.log('A的事情');
? ? if(pairMethodStep === 1){
? ? ? ? methodB();
? ? }else{
? ? ? ? pairMethodStep = 2;
? ? }
}
function methodB() {
? ? pairMethodStep --;
? ? console.log('B的事情');
? ? if(pairMethodStep === 1){
? ? ? ? methodA();
? ? }else{
? ? ? ? pairMethodStep = 2;
? ? }
}熵遞減算法的說(shuō)明:
給一個(gè)全局變量,叫做總步數(shù)pairMethodStep ,初始值為2。任一個(gè)方法執(zhí)行時(shí),做完自己的事情后,把pairMethodStep減成1。然后,判斷此時(shí)的pairMethodStep,如果是1, 就調(diào)用另一個(gè)方法;如果是0了,就不再繼續(xù)調(diào)用了,而是把pairMethodStep恢復(fù)成2。
我們分析一下代碼執(zhí)行的過(guò)程。主動(dòng)的方法執(zhí)行前,pairMethodStep的值是2,它做完自己的事后,把pairMethodStep的值變成了1,緊跟著就會(huì)執(zhí)行被動(dòng)的方法;被動(dòng)的方法執(zhí)行前,pairMethodStep的值是1,被動(dòng)的方法做完自己的事情后,把pairMethodStep的值減成了0,不會(huì)再調(diào)用另一個(gè)方法了(不會(huì)發(fā)生死循環(huán)了),而僅僅是把pairMethodStep還原成2。
目的達(dá)到。熵遞減算法,能完美地解決兩個(gè)函數(shù)相互調(diào)用的問(wèn)題。
js函數(shù)互相調(diào)用碰到的問(wèn)題
項(xiàng)目場(chǎng)景
兩個(gè)函數(shù)互相調(diào)用時(shí)
(當(dāng)一個(gè)系統(tǒng)比較大時(shí),尤其是涉及到一些復(fù)雜的算法時(shí),很有可能會(huì)碰到死循環(huán)的情況發(fā)生,造成系統(tǒng)的CPU飆升)
? ? ? ? function a1() {
? ? ? ? ? ? console.log("a1");
? ? ? ? ? ? b1();
? ? ? ? }
? ? ? ? function b1() {
? ? ? ? ? ? console.log("b1");
? ? ? ? ? ? a1();
? ? ? ? }問(wèn)題描述
會(huì)進(jìn)入死循環(huán)
原因分析
就類似for循環(huán),或者遞歸函數(shù)如果沒(méi)有退出條件就會(huì)一直執(zhí)行
解決方案
? ? ? ? let flagNum = 1;
?
? ? ? ? function a1() {
? ? ? ? ? ? flagNum--;
? ? ? ? ? ? console.log("a1");
? ? ? ? ? ? if (flagNum === 0) {
? ? ? ? ? ? ? ? b1();
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? flagNum = 1;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? function b1() {
? ? ? ? ? ? flagNum--;
? ? ? ? ? ? console.log("b1");
? ? ? ? ? ? if (flagNum === 0) {
? ? ? ? ? ? ? ? a1();
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? flagNum = 1;
? ? ? ? ? ? }
? ? ? ? }總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
微信小程序使用map組件實(shí)現(xiàn)獲取定位城市天氣或者指定城市天氣數(shù)據(jù)功能
這篇文章主要介紹了微信小程序使用map組件實(shí)現(xiàn)獲取定位城市天氣或者指定城市天氣數(shù)據(jù)功能,涉及微信小程序map組件結(jié)合微信API獲取天氣信息相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
妙用Bootstrap的 popover插件實(shí)現(xiàn)校驗(yàn)表單提示功能
最近使用bootstrap開(kāi)發(fā)項(xiàng)目比較多,在表單校驗(yàn)功能中用popover插件實(shí)現(xiàn)出錯(cuò)提示功能很方面,下面小編給大家?guī)?lái)了一篇關(guān)于Bootstrap的 popover插件實(shí)現(xiàn)校驗(yàn)表單提示功能的實(shí)現(xiàn)代碼,非常不錯(cuò),感興趣的朋友一起看看吧2016-08-08
Javascript實(shí)現(xiàn)Array和String互轉(zhuǎn)換的方法
這篇文章主要介紹了Javascript實(shí)現(xiàn)Array和String互轉(zhuǎn)換的方法,涉及JavaScript中toString方法與split方法的使用技巧,需要的朋友可以參考下2015-12-12
javascript實(shí)現(xiàn)倒計(jì)時(shí)(精確到秒)
本文給大家分享的是個(gè)人項(xiàng)目中使用的javascript實(shí)現(xiàn)的精確到秒級(jí)的倒計(jì)時(shí)代碼,十分的實(shí)用,有需要的小伙伴可以參考下。2015-06-06
Bootstrap作品展示站點(diǎn)實(shí)戰(zhàn)項(xiàng)目2
這篇文章主要為大家分享了Bootstrap作品展示站點(diǎn)實(shí)戰(zhàn)項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
javascript 文章截取部分無(wú)損html顯示實(shí)現(xiàn)代碼
近在做一些內(nèi)容搜索的工作,搜索出來(lái)的內(nèi)容為html格式,列表部分需要顯示每項(xiàng)內(nèi)容的一部分。2010-05-05
js動(dòng)態(tài)創(chuàng)建標(biāo)簽示例代碼
這篇文章主要以示例的方式為大家介紹下js如何動(dòng)態(tài)創(chuàng)建標(biāo)簽,需要的朋友可以參考下2014-06-06
微信小程序基于本地緩存實(shí)現(xiàn)點(diǎn)贊功能的方法
這篇文章主要介紹了微信小程序基于本地緩存實(shí)現(xiàn)點(diǎn)贊功能的方法,涉及微信小程序界面布局、事件響應(yīng)及緩存操作等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12
js實(shí)現(xiàn)隨機(jī)數(shù)字字母驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了js隨機(jī)驗(yàn)證碼的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

