一个函数定期调用自身直到条件,但很快就会循环崩溃

时间:2016-10-05 18:01:23

标签: javascript recursion nested

我正在尝试构建一个定期检查无限数量变量的函数,如果它们都是假的,那么就做了什么。

该功能应该"返回"满足条件时,每隔x ms调用一次。

这里我使用setTimeout为函数调用自身,延迟时间很长,以避免快速循环和崩溃。但由于某种原因,该功能立即调用自己。它做了很多次,崩溃了浏览器(实际上我的操作系统几次)。

我似乎对嵌套功能的进展缺乏一些基本的了解。

现在,函数循环和崩溃,请注意。

违规行在函数checkIf()的末尾,有一个setTimeout再次调用函数本身。

函数查找的变量是" users [i] .listening",如果要模拟满足条件,请将它们都更改为false。

// *****DO NOT RUN THIS CODE, IT LOOPS/CRASHES BROWSERS 
// *****************************************************

users = [{user:"11", listening: "true"},{user:"22", listening:"false"}];

function checkIf(){
    var falses = 0; // We assume there are no users with listening = "false" yet
    for (var i = 0; i < users.length; i++) { // for each user
          if(users[i].listening == "false"){ // if its listening is "false"
              falses++; //+1 to var falses   
              if (falses == users.length){ // && if all user's listening are false
                  userDo(); // launch the action
                  return true; // get out of checkIf()
              } 
          } 
     } 

     //THIS SEEMS TO BE WHAT CAUSES THE LOOP/CRASH >>>>
     setTimeout(checkIf(), 4000); //otherwise repeat every 4 seconds 
}

function userDo(){ //this function makes those users do stuff
    for (var i = 0; i < users.length; i++) {
        console.log("user " + users[i].user +" do this or that");
    }
}

checkIf(); //launch the checking function for the first time

这里是小提琴(有一些console.log用于调试)

https://jsfiddle.net/r1jo84jm/1/

感谢阅读和你的帮助。

0 个答案:

没有答案