Tobschmi Tobschmi - 24 days ago 8
Javascript Question

Javascript return undefined of recursive function with Date()

i have a problem with a recursive javascript function - The return value is undefined:

function get_next_weekday(timesec) {

var nextdaytogo = timesec;
var nextday;
var hour = timesec.getHours();
initstunden = 13 - hour;
initminuten = 59 - timesec.getMinutes();
var holidays = [
new Date(2016, 11, 25).toDateString(), new Date(2016, 11, 26).toDateString(), new Date(2017, 00, 01).toDateString(), new Date(2017, 00, 06).toDateString(),
new Date(2017, 03, 14).toDateString(), new Date(2017, 03, 17).toDateString(), new Date(2017, 04, 01).toDateString(), new Date(2017, 04, 25).toDateString(),
new Date(2017, 05, 05).toDateString(), new Date(2017, 05, 15).toDateString(), new Date(2017, 09, 03).toDateString(), new Date(2017, 10, 01).toDateString(),
new Date(2017, 11, 25).toDateString(), new Date(2017, 11, 26).toDateString(), new Date(2018, 00, 01).toDateString(), new Date(2018, 00, 06).toDateString(),
new Date(2018, 02, 30).toDateString(), new Date(2018, 03, 02).toDateString(), new Date(2018, 04, 01).toDateString(), new Date(2018, 04, 10).toDateString(),
new Date(2018, 04, 21).toDateString(), new Date(2018, 04, 31).toDateString(), new Date(2018, 09, 03).toDateString(), new Date(2018, 10, 01).toDateString(),
new Date(2018, 11, 25).toDateString(), new Date(2018, 11, 26).toDateString()
];


if ( $.inArray(timesec.toDateString(), holidays) > -1 || timesec.getDay() == 0 || timesec.getDay() == 6) {
console.log("if() Statement")
//Holiday
if ( $.inArray(timesec.toDateString(), holidays) > -1){
console.log("Holiday Func." + timesec);
var nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
var next = get_next_weekday(nextday);

}
//Sunday
else if (timesec.getDay() == 0){
console.log("Sunday Func." + timesec);
var nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
var next = get_next_weekday(nextday);

}
//Saturday
else if (timesec.getDay() == 6){
console.log("Saturday Func." + timesec);
var nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
var next = get_next_weekday(nextday);

}
else console.log("Und. Func.");


}
else{
console.log("else Statement - Value: " + next);
return timesec;
}
}

var daydeliver = get_next_weekday(aktuell);
console.log("Func. - Return: " + daydeliver);


And this is the log:


  1. if() Statement SaturdayFunc.Sat Dec 23 2017 11:11:53 GMT+0100 if()
    Statement Sunday Func.Sun Dec 24 2017 11:11:53 GMT+0100 if()
    Statement Holiday Func.Mon Dec 25 2017 11:11:53 GMT+0100 if()
    Statement Holiday Func.Tue Dec 26 2017 11:11:53 GMT+0100 else
    Statement - Value: undefined Func. - Return: undefined



Can someone help me with this problem?

Answer

it is because you declare var in local scope + you return nothing when recursive fn triggered. I suppose you want next to hold previous date from recursive fn. Please review this one:

//next will return undefined if no recursive function called
var next;
function get_next_weekday(timesec) {

    var nextdaytogo = timesec;
    var nextday;
    var hour = timesec.getHours();
    initstunden = 13 - hour;
    initminuten = 59 - timesec.getMinutes();
    var holidays = [
        new Date(2016, 11, 25).toDateString(), new Date(2016, 11, 26).toDateString(), new Date(2017, 00, 01).toDateString(), new Date(2017, 00, 06).toDateString(), 
        new Date(2017, 03, 14).toDateString(), new Date(2017, 03, 17).toDateString(), new Date(2017, 04, 01).toDateString(), new Date(2017, 04, 25).toDateString(), 
        new Date(2017, 05, 05).toDateString(), new Date(2017, 05, 15).toDateString(), new Date(2017, 09, 03).toDateString(), new Date(2017, 10, 01).toDateString(), 
        new Date(2017, 11, 25).toDateString(), new Date(2017, 11, 26).toDateString(), new Date(2018, 00, 01).toDateString(), new Date(2018, 00, 06).toDateString(), 
        new Date(2018, 02, 30).toDateString(), new Date(2018, 03, 02).toDateString(), new Date(2018, 04, 01).toDateString(), new Date(2018, 04, 10).toDateString(), 
        new Date(2018, 04, 21).toDateString(), new Date(2018, 04, 31).toDateString(), new Date(2018, 09, 03).toDateString(), new Date(2018, 10, 01).toDateString(), 
        new Date(2018, 11, 25).toDateString(), new Date(2018, 11, 26).toDateString()
    ];


    if ( $.inArray(timesec.toDateString(), holidays) > -1 || timesec.getDay() == 0 || timesec.getDay() == 6) {
        console.log("if() Statement")
        //Holiday
        if ( $.inArray(timesec.toDateString(), holidays) > -1){
            console.log("Holiday Func." + timesec);
            let nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
             next = timesec;
             return get_next_weekday(nextday);

        }
        //Sunday
        else if (timesec.getDay() == 0){
            console.log("Sunday Func." + timesec);
            let nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
            next = timesec;
          return get_next_weekday(nextday);

        }
        //Saturday
        else if (timesec.getDay() == 6){
            console.log("Saturday Func." + timesec);
            let nextday = new Date(timesec.getTime() + 24 * 60 * 60 * 1000);
            next = timesec;
          return get_next_weekday(nextday);

        }
        else {console.log("Und. Func.");
            next = "Und. Func.";return;
            }
    }
    else{
        console.log("else Statement - Value: " + next);
        return timesec;
    }    
}

var daydeliver = get_next_weekday(new Date(2016, 11, 11));
console.log("Func. - Return: " + daydeliver);
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.1.1.min.js"></script>