兩個函數相互調用如何防止死循環
兩個函數相互調用防止死循環
最近碰到瞭一個問題,就是兩個函數相互調用遭遇死循環的問題,想瞭半天終於想出瞭一個算法破解,姑且叫它熵遞減算法。
問題的抽象代碼如下
/* * methodA 和 methodB 循環調用,是死循環 * */ function methodA() { console.log('A的事情'); methodB(); } function methodB() { console.log('B的事情'); methodA(); }
不論調用哪個方法,都會產生死循環。
我想要的效果是:
如果觸發A方法時,也執行一下B方法,到此為止不再循環下去,反之亦然。
因此,必須能判斷方法是主動發起的,還是被動的。
抽象代碼如下:
/* * 解決問題的關鍵在於,判斷方法是主動發起的,還是被動的 * */ function methodA() { console.log('A的事情'); if('A是主動的'){ methodB(); }else{ // 不再調用下去 } } function methodB() { console.log('B的事情'); if('B是主動的'){ methodA(); }else{ // 不再調用下去 } }
解法,就是熵遞減算法,如下
/* * 熵遞減算法 * */ 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; } }
熵遞減算法的說明:
給一個全局變量,叫做總步數pairMethodStep ,初始值為2。任一個方法執行時,做完自己的事情後,把pairMethodStep減成1。然後,判斷此時的pairMethodStep,如果是1, 就調用另一個方法;如果是0瞭,就不再繼續調用瞭,而是把pairMethodStep恢復成2。
我們分析一下代碼執行的過程。主動的方法執行前,pairMethodStep的值是2,它做完自己的事後,把pairMethodStep的值變成瞭1,緊跟著就會執行被動的方法;被動的方法執行前,pairMethodStep的值是1,被動的方法做完自己的事情後,把pairMethodStep的值減成瞭0,不會再調用另一個方法瞭(不會發生死循環瞭),而僅僅是把pairMethodStep還原成2。
目的達到。熵遞減算法,能完美地解決兩個函數相互調用的問題。
js函數互相調用碰到的問題
項目場景
兩個函數互相調用時
(當一個系統比較大時,尤其是涉及到一些復雜的算法時,很有可能會碰到死循環的情況發生,造成系統的CPU飆升)
function a1() { console.log("a1"); b1(); } function b1() { console.log("b1"); a1(); }
問題描述
會進入死循環
原因分析
就類似for循環,或者遞歸函數如果沒有退出條件就會一直執行
解決方案
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; } }
總結
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 解決SpringBoot中使用@Transactional註解遇到的問題
- Spring的嵌套事務(Propagation.NESTED)到底是個啥案例代碼講解
- web面試之JS預解析與變量提升區別
- ShardingJdbc讀寫分離的BUG踩坑解決
- JavaScript中箭頭函數與普通函數的區別詳解