La declaración if en canBookSlot() solo se verifica una vez por alguna razón. La segunda vez que se canBookSlot() , userDetailsObj.canBook debería ser 0 después de ejecutar updateUser() . Y de acuerdo con el registro de la consola, es el caso, pero la instrucción if aún se ejecuta, ¿por qué?
let userDetailsString = localStorage.getItem("userDetails"); let userDetailsObj = JSON.parse(userDetailsString); const updateUser = () => { userDetailsObj["hasBooked"] = 1; userDetailsObj["canBook"] = 0; }; const canBookSlot = (id) => { if (userDetailsObj.canBook != 0) { // always true updateUser(); Axios.post("http://localhost:3001/api/book/week1/ex", { room: userDetailsObj.room, id: id.id + 1, }).then(() => updateData()); } else { console.log("already booked"); } };Después de cada procesamiento, userDetailsObj tomará ese valor de localStorage . Así es como se comporta cada variable dentro de un componente que no es un state hecho con useState hook, o una ref hecha con useRef hook. Puede solucionar su problema usando un state , así:
const [userDetails, setUserDetails] = useState(JSON.parse(localStorage.getItem("userDetails"))); const updateUser = () => { const newUserDetails = { ...userDetailsObj, hasBooked: 1, canBook: 0 }; setUserDetails(newUserDetails); localStorage.setItem("userDetails", JSON.stringify(newUserDetails)); }; const canBookSlot = (id) => { if (userDetails.canBook != 0) { //Always true updateUser(); Axios.post("http://localhost:3001/api/book/week1/ex", { room: userDetailsObj.room, id: id.id + 1, }).then(() => updateData()); } else { console.log("already booked"); } };¿Puede aclarar dónde se ejecuta este código? ¿Está utilizando un componente de clase o un componente funcional? ¿Te importaría compartir el componente completo? Si está haciendo lo que creo que está haciendo, let userDetailsString = localStorage.getItem("userDetails"); está ejecutando cada procesamiento , lo que significa que en cada procesamiento, toma el valor en localStorage y lo usa, en lugar de usar su objeto almacenado en userDetailsObj .
Si está usando componentes funcionales, puede arreglar esto usando state.
let userDetailsString = localStorage.getItem("userDetails"); let [userDetailsObj, updateUserDetailObj] = useState(JSON.parse(userDetailsString)); const updateUser = () => { let u = { ...userDetailsObj, hasBooked: 1, canBook: 0, } updateUserDetailObj(u); };Si está utilizando componentes de clase, hágamelo saber y lo actualizaré con esa opción.