1

Been knocking my head for a few hours searching for a solution. Why would prevDate return undefined? Just don't understand what I am missing.

async function prevDate(date) {
    date.setDate(date.getDate()-1)
    if (date.getDay() == 0 || date.getDay() == 6) {
        prevDate(date)
    } else {
        console.log("date: ", date, "day: ", date.getDay())
        return (date)
    }
}

date = new Date("2021-09-20T00:00:00")
prevDate(date)
.then((res) => {
    console.log("res: ", res) //undefined
})
.catch((err) => {
    console.log(err)
})

output
date:  2021-09-17T04:00:00.000Z day:  5
res:  undefined
Chris
  • 11
  • 1
  • `prevDate` has an execution path that results in the function finishing without hitting a return statement. No value returned = funtion returns undefined... ;) – enhzflep Sep 24 '21 at 23:27
  • Does this answer your question? [Simple Recursive Javascript Function Returns Undefined](https://stackoverflow.com/questions/40588384/simple-recursive-javascript-function-returns-undefined) – Robin Zigmond Sep 24 '21 at 23:39
  • Not that I understand why. Removed the else and worked. Thought the else would have been evaluated. I am a novice and have a bit more to learn. Thanks.. – Chris Sep 24 '21 at 23:44

2 Answers2

0

The other people stated the reason your code doesn't work. But I'm wondering why you are using an async function for code that is not asynchronous. If you still want to use a recursive function it can be simply written like this:

function prevDate (date) {
  date.setDate(date.getDate() - 1);
  
  if (!(date.getDay() % 6)) {
    return prevDate(date);
  } else {
    console.log(`date: ${date} day: ${date.getDay()}`);
    return date;
  }
}

const date = new Date("2021-09-20T00:00:00");
console.log(`res: ${prevDate(date)}`);

Or you can simplify it even further:

const prevDate = (date) => {
  date.setDate(date.getDate() - 1);
  return !(date.getDay() % 6) ? prevDate(date) : date;
};

const date = new Date("2021-09-20T00:00:00");
console.log(`res: ${prevDate(date)}`);
Marcin
  • 278
  • 1
  • 7
  • If you reverse the sense of the comparison the last line is simpler: `return date.getDay() % 6 ? date : prevDate(date)`. :-) – RobG Sep 25 '21 at 12:28
0

You can write a simple function that subtracts 1, 2 or 3 days depending on which day of the week the date is on, e.g.

// Return previous work day (i.e. not Sat or Sun)
function getPreviousWorkDay(d = new Date()) {
  return new Date(d.getFullYear(), d.getMonth(), d.getDate() - ({1:3, 0:2}[d.getDay()] || 1)
  );
}

// Examples over year and month end
[new Date(2020,11,28), // Mon
 new Date(2020,11,29), // Tue
 new Date(2020,11,30), // Wed
 new Date(2020,11,31), // Thu
 new Date(2021, 0, 1), // Fri
 new Date(2021, 0, 2), // Sat
 new Date(2021, 0, 3), // Sun
].forEach(d => 
  console.log(`${d.toDateString()} => ${getPreviousWorkDay(d).toDateString()}`)
);
RobG
  • 142,382
  • 31
  • 172
  • 209