Los siguientes 2 métodos verifican si alguien está disponible para cada día dentro de un rango de fechas. Tengo 2 variables, una que cuenta el total de días entre cada fecha (dayCount) y la otra aumenta cuando la persona está disponible para la fecha dada (validDays).
Si las 2 variables no son iguales, se presenta un mensaje de error diciendo que no están disponibles.
La función checkAvailable() llama a la función setAvailable() que a su vez realiza una llamada AJAX para verificar la disponibilidad de la persona en una fecha. La llamada AJAX devuelve verdadero/falso. Esto funciona y devuelve el valor correcto.
El problema que tengo es que tengo que hacer clic en el botón dos veces para que dayCount y validDays tengan los valores correctos. Por ejemplo, si selecciono una reserva PM, sé que la persona está disponible. La primera vez que presiono el botón dice No disponible, la segunda y todas las veces posteriores dice disponible.
Pensé que el problema era que la sincronización no finalizaba antes de hacer la comparación de las 2 variables, pero después de agregar algunas pausas para verificar, ese no parece ser el caso.
codigo Javascript -
var validDays = 0; function checkAvailable() { event.preventDefault(); var teacher = $("#selectedTeacher").val(); var startDate = new Date($("#startDate").val()); var endDate = new Date($("#endDate").val()); var dayCount = 0; // loop for every day for (var day = startDate; day <= endDate; day.setDate(day.getDate() + 1)) { console.log('date: ' + day); var duration; var starttime; var endtime; var dayOfWeek = day.getDay(); var monday = document.getElementById('enableMon'); var tuesday = document.getElementById('enableTue'); var wednesday = document.getElementById('enableWed'); var thursday = document.getElementById('enableThu'); var friday = document.getElementById('enableFri'); if (dayOfWeek == "1" && monday.checked) { duration = $("#DurationMonday").val(); starttime = $("#startTimeMon").val(); endtime = $("#endTimeMon").val(); console.log('Add 1 to day count - ' + dayCount + '. Valid days are - ' + validDays); setAvailable(teacher, day, duration); dayCount = dayCount + 1; console.log('Day count is now - ' + dayCount + '. Valid days are - ' + validDays); } else if (dayOfWeek == "2" && tuesday.checked) { duration = $("#DurationTuesday").val(); starttime = $("#startTimeTue").val(); endtime = $("#endTimeTue").val(); console.log('Add 1 to day count - ' + dayCount + '. Valid days are - ' + validDays); setAvailable(teacher, day, duration); dayCount = dayCount + 1; console.log('Day count is now - ' + dayCount + '. Valid days are - ' + validDays); } else if (dayOfWeek == "3" && wednesday.checked) { duration = $("#DurationWednesday").val(); starttime = $("#startTimeWed").val(); endtime = $("#endTimeWed").val(); console.log('Add 1 to day count - ' + dayCount + '. Valid days are - ' + validDays); setAvailable(teacher, day, duration); dayCount = dayCount + 1; console.log('Day count is now - ' + dayCount + '. Valid days are - ' + validDays); } else if (dayOfWeek == "4" && thursday.checked) { duration = $("#DurationThursday").val(); starttime = $("#startTimeThu").val(); endtime = $("#endTimeThu").val(); console.log('Add 1 to day count - ' + dayCount + '. Valid days are - ' + validDays); setAvailable(teacher, day, duration); dayCount = dayCount + 1; console.log('Day count is now - ' + dayCount + '. Valid days are - ' + validDays); } else if (dayOfWeek == "5" && friday.checked) { duration = $("#DurationFriday").val(); starttime = $("#startTimeFri").val(); endtime = $("#endTimeFri").val(); console.log('Add 1 to day count - ' + dayCount + '. Valid days are - ' + validDays); setAvailable(teacher, day, duration); dayCount = dayCount + 1; console.log('Day count is now - ' + dayCount + '. Valid days are - ' + validDays); } } if(dayCount == validDays) { toastNotifySuccess("Available", 2000); $("#btnSave").attr('disabled', false); } else { toastNotifyError("The selected teacher is not available", 2000); $("#btnSave").attr('disabled', true); } dayCount = 0; validDays = 0; }; async function setAvailable(teacher, day, duration) { return await $.ajax({ url: '/Availability/CheckAvailabilityForDate?teacher=' + teacher + '&date=' + day.toISOString() + '&duration=' + duration, type: 'POST', dataType: 'json', contentType: "application/json; charset=utf-8", success: function (response) { if (response == false) { } else if(response == true) { console.log('add 1 to valid days - ' + validDays); validDays = validDays + 1; console.log('added 1 to valid days - ' + validDays); } } }); };MVC
[HttpPost] public async Task<string> CheckAvailabilityForDate(int teacher, DateTime date, BookingDuration duration, DateTime startTime, DateTime endTime) { bool available = true; available = await _availabilityService.CheckAvailable(date, teacher, duration, startTime, endTime, null); return JsonSerializer.Serialize(available); }Olvidaste usar await . Sin él, inicia la solicitud, pero no espera el resultado. Si ejecuta el método en segundo lugar, es probable que la solicitud se haya realizado y vea los días válidos correctos.
async function checkAvailable { // notice async keyword ... await setAvailable(teacher, day, duration); // notice await keyword ... }