Soy nuevo en reaccionar nativo y no sé cuál es la mejor manera de hacerlo. Tengo una matriz de objetos guardados en AsyncStorage que se ven así;
[ { userId: 1, id: 1, title: "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", body: "quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto" }, { userId: 1, id: 2, title: "qui est esse", body: "est rerum tempore vitae sequi sint nihil reprehenderit dolor beatae ea dolores neque fugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis qui aperiam non debitis possimus qui neque nisi nulla" } ]Puedo realizar una operación completa en AsyncStorage sin conexión a Internet. Sin embargo, quiero enviar estos datos a una base de datos mongoDB remota. Si existe una publicación, quiero que se actualice, si no existe, quiero que se cree la publicación.
Estoy usando redux. Entonces, lo que hice fue recorrer la matriz desde AsyncStorage, si un objeto tiene "_id", significa que el objeto ya existe en la base de datos, si no es así, crea el objeto así;
useEffect(() => { posts.map((post) => { if(!("_id" in post)) { dispatch(sendNewPostToDatabase(post)) } else{ dispatch(updatePostInDatabase(post._id, post)) } }) },[posts]) la acción sendNewPostToDatabase se ve así;
export const sendNewPostToDatabase = (post) => async (dispatch) => { try { const { data } = await api.createPost(post); let savedItems = []; const response = await AsyncStorage.getItem("queue"); if (response) savedItems = JSON.parse(response); const updatedList = await savedItems.map((item) => item.id === data.id ? data : item) dispatch({ type: FETCH_POSTS_BY_USER, payload: updatedList }); return AsyncStorage.setItem("queue", JSON.stringify(updatedList)); } catch (error) { console.log(error.response) } } Y luego mi acción updatePostInDatabase se ve así;
export const updatePostInDatabase = (id, post) => async (dispatch) => { try { await api.updatePost(id, post); } catch (error) { console.log(error); } }El problema es que este enfoque da como resultado un bucle infinito, donde la aplicación sigue enviando los datos una y otra vez creando una nueva publicación de forma repetitiva, incluso si la publicación ya existe en la base de datos. Además, quiero enviar solo publicaciones nuevas y actualizar solo publicaciones con nuevos cambios. Por favor, ¿cómo puedo lograr esto de manera efectiva?