He estado golpeando mi cabeza durante unas horas buscando una solución. ¿Por qué prevDate devolvería indefinido? Simplemente no entiendo lo que me estoy perdiendo.
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: undefinedLas otras personas indicaron la razón por la que su código no funciona. Pero me pregunto por qué está utilizando una función asíncrona para el código que no es asíncrono. Si aún desea usar una función recursiva, puede escribirse simplemente así:
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)}`);O puedes simplificarlo aún más:
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)}`);Puede escribir una función simple que reste 1, 2 o 3 días según el día de la semana en que se encuentre la fecha, por ejemplo
// Return previous work day (ie 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()}`) );