cinead
cinead

Reputation: 337

Javascript For Loop interrupted by function call?

I have a for-loop that is terminating without finishing the loop. It seems to be related to whether or not a call to another function is made within the loop.

this.cycle = function() {
    var list = this.getBreaches("Uncontained");
    if (list.length > 0) {
        for (i=0; i < list.length; i++) {
           this.saveVsRupture(DC=11, i);   //calls this.rupture() if save failed
    }}
    return 1;
};

this.saveVsRupture() calls a function that rolls a d20 and checks the result. If the save fails, it calls a method called this.rupture() that does some adjusting to this.

Problem If the saving throw is successful, the loop continues, but if the saving throw fails, it runs the this.rupture() function and then breaks the for-loop. It should keep running the for-loop.

Why is this happening?

Additional Details Here are the other functions...

    savingThrow = function(DC=11) {
    // DC = Difficulty Check on a d20   
    try {
        if (0 <= DC) {      
            var roll = Math.floor((Math.random() * 20))+1;  //roll d20
            var msg = "(Rolled "+roll+" vs DC "+DC+")";
            console.log(msg);       
            if (roll >= DC) {   //Saved
                return true;
            }
            else {  //Failed save
                return false;
            }
        }
    }
    catch(e) {
        console.log("Exception in savingThrow: "+e);        
    };
  };

    this.saveVsRupture = function(DC=1, i=null) {
    try {
        if (!savingThrow(DC)) {
            this.rupture(i);
            return false;
        }
        return true;
    }
    catch(e) {
        console.log(e);         
        }   
};


    this.rupture = function(i=null) {
    if (i == null) {
        i = range(1,this.damageList.length).sample();       
    }
    var hole = this.damageList[i];
    var dmg = range(1,this.harmonics()).sample();
    hole.rupture(dmg);
    msg = "*ALERT* " + hole + " expanded by " + dmg + "% Hull Integrity @"+this.hullIntegrity();
    this.log(msg);
    if (hole.size % 10 == 0) {
        this.health -= 25;
        msg = "The ship creaks ominously.";
        this.log(msg); 
    }
    return 1;
};  

Upvotes: 0

Views: 346

Answers (3)

cinead
cinead

Reputation: 337

The correct syntax for the for-loop declares the counter variable.

    for (var i=0; i < list.length; i++) {etc..

    /// Causes the For-Loop to exit prematurely...
    for (i=0; i < list.length; i++) {etc..

Once the "var i=0" is used, the for-loop operates as expected.

Upvotes: 2

Pedram
Pedram

Reputation: 828

Change the saveVsRupture function like this:

function saveVsRupture(a,b) {
    try{
        //your saveVsRupture code here...
    }
    catch(e){}
}

Your should catch problems that occurred in your code with try,catch block to prevent throw them to top level of your code (the browser in this example) .

Don't use return in for loop!

Change your code as following:

this.cycle = function() {
    var list = this.getBreaches("Uncontained");
    if (list.length > 0) {
        for (i=0; i < list.length; i++) {
            var temp = this.saveVsRupture(DC=11, i);   //calls this.rupture() if save failed
            console.log(temp);
        }}
    return 1;
};

Upvotes: 0

Noam Hacker
Noam Hacker

Reputation: 4825

consider implementing a try-catch in your for loop, with your saveVsRupture function within the try. This implementation will catch errors in your function but allow the program to keep running.

Upvotes: 0

Related Questions