Wycofywanie zmian po błędzie i rozwiązywanie konfliktów
Przywracać poprzedni stan po nieudanej mutacji i poprawnie obsługiwać odrzucone przez serwer zmiany optymistyczne
Wycofywanie zmian po błędzie i rozwiązywanie konfliktów to bezpłatna lekcja React Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.
Złożoność wycofywania zmian zależy od typu mutacji
Wycofanie optymistycznego dodania (usunięcie elementu) lub usunięcia (przywrócenie elementu) jest proste. Wycofanie aktualizacji jest bardziej złożone: należy przywrócić dokładnie poprzednią wartość. Jeśli element został kilkakrotnie zaktualizowany optymistycznie, trzeba osobno śledzić każdą wcześniejszą wartość, a nie tylko pierwotny stan z serwera.
Scenariusz konfliktu aktualizacji
Rozważmy następujący scenariusz: serwer ma element o wartości Z. Optymistycznie aktualizujesz go do wartości X. Gdy Twoje żądanie jest w toku, inny użytkownik aktualizuje ten sam element na serwerze do wartości Y. Twoje żądanie dociera do serwera, który je odrzuca z powodu konfliktu. Celem wycofania zmian jest wartość Z, ale bieżący stan serwera to Y. Przywrócenie wartości Z nieprawidłowo nadpisałoby wartość Y.
Ponowne pobranie po błędzie jako bezpieślna opcja domyślna
Najbezpieczniejszą strategią wycofywania zmian w przypadku aktualizacji jest ponowne pobranie elementu z serwera po każdym błędzie mutacji, zamiast przywracania migawki zapisanej lokalnie. Dzięki temu zawsze wyświetlasz autorytatywny stan serwera, niezależnie od tego, jakie zmiany mogli równocześnie wprowadzić inni użytkownicy. Ponowne pobranie jest wolniejsze, ale zawsze zapewnia poprawny stan.
Status HTTP 409 Conflict
Dobrze zaprojektowane API zwraca HTTP 409 Conflict, gdy optymistyczna aktualizacja nie powiedzie się z powodu równoczesnej modyfikacji. Treść odpowiedzi zazwyczaj zawiera bieżący stan serwera. Procedura obsługi błędów powinna wykryć status 409, użyć treści odpowiedzi do zaktualizowania lokalnego stanu bieżącą wartością z serwera oraz poinformować użytkownika, że jego zmiany nie zostały zapisane.
Idempotencja na potrzeby bezpiecznych ponowień
Mutacja idempotentna daje ten sam rezultat przy wielokrotnym zastosowaniu. Projektowanie mutacji jako idempotentnych — za pomocą PUT zamiast POST, przesyłania pełnego stanu zasobu oraz kluczy idempotencji — umożliwia bezpieczne ponawianie operacji po błędzie bez ryzyka wielokrotnego zastosowania zmiany. Znacznie upraszcza to logikę wycofywania zmian.
Dedupikacja za pomocą isSubmitting
Dwukrotne kliknięcie przycisku przesyłania może uruchomić dwie identyczne mutacje. Aby temu zapobiec, użyj flagi isSubmitting: ustaw ją na true po rozpoczęciu mutacji, a po jej zakończeniu — niezależnie od powodzenia lub niepowodzenia — przywróć jej poprzednią wartość. Wyłącz element uruchamiający, gdy isSubmitting ma wartość true. Eliminuje to duplikaty mutacji na poziomie interfejsu użytkownika.
Klucze idempotencji do deduplikacji po stronie serwera
W celu deduplikacji po stronie serwera dołącz do każdego żądania mutacji unikatowy nagłówek Idempotency-Key. Wygeneruj jego wartość za pomocą crypto.randomUUID() w chwili rozpoczęcia działania przez użytkownika. Serwer wykrywa zduplikowane klucze i zwraca taką samą odpowiedź jak w przypadku pierwotnego żądania, nie wykonując operacji ponownie.
Wskaźniki spójności ostatecznej
Gdy mutacja jest w toku, możesz wyświetlić dyskretny wskaźnik informujący, że optymistyczny stan nie został jeszcze potwierdzony: małą pulsującą kropkę, tekst „Zapisywanie...” lub zmniejszone krycie elementu. Przekazuje to informację o niepewności bez blokowania interakcji. Usuń wskaźnik po powodzeniu albo wycofaj zmiany w razie niepowodzenia.
Granice błędów dla niepowodzeń mutacji
Nieoczekiwane błędy w logice wycofywania zmian, na przykład odwołanie do właściwości wartości undefined podczas przywracania stanu, mogą doprowadzić do awarii komponentu. Owiń komponenty intensywnie korzystające z mutacji w granicę błędów, aby krytyczne błędy wycofywania zmian wyświetlały kontrolowany interfejs błędu zamiast pustego ekranu. Rejestruj te błędy na potrzeby debugowania.
Wersjonowanie na potrzeby wykrywania konfliktów
Niezawodna strategia wykrywania konfliktów polega na dołączaniu numeru wersji lub ETag do każdej mutacji. Serwer porównuje wersję przesłaną przez klienta ze swoją bieżącą wersją. Jeśli wersje się różnią, czyli wystąpiła inna aktualizacja, serwer zwraca status 409. To optymistyczna kontrola współbieżności — zakładasz brak konfliktu, ale wykrywasz go, gdy wystąpi.
Testowanie ścieżek wycofywania zmian
Logika wycofywania zmian często nie jest testowana, ponieważ trudno symulować awarie sieci. Użyj narzędzi takich jak Mock Service Worker (MSW), aby w testach zwracać odpowiedzi błędów. Napisz osobne testy dla obsługi statusu 409 Conflict, wycofywania zmian po przekroczeniu limitu czasu sieci, deduplikacji dwukrotnych kliknięć oraz spójności stanu po błędzie. To właśnie w tych przypadkach brzegowych często ukrywają się błędy.
Status HTTP wykrywania konfliktu
Jaki kod statusu HTTP zwraca dobrze zaprojektowane API, gdy optymistyczna aktualizacja nie powiedzie się z powodu równoczesnej modyfikacji wykonanej przez innego użytkownika?
Podsumowanie lekcji: wycofywanie zmian i konflikty
Wycofywanie aktualizacji jest bardziej złożone niż wycofywanie dodawania lub usuwania — po błędzie zawsze ponownie pobieraj dane, aby uniknąć problemów z nieaktualną migawką. Status HTTP 409 Conflict sygnalizuje niepowodzenie optymistycznej kontroli współbieżności; użyj treści odpowiedzi, aby przywrócić bieżący stan serwera. Projektuj mutacje jako idempotentne, aby bezpiecznie je ponawiać. Zapobiegaj wielokrotnemu uruchomieniu za pomocą isSubmitting i kluczy idempotencji po stronie serwera. Testuj ścieżki wycofywania zmian osobno, używając MSW do symulowania błędów.
Często zadawane pytania
Czy lekcja „Wycofywanie zmian po błędzie i rozwiązywanie konfliktów” jest bezpłatna?
Tak — pełny tekst „Wycofywanie zmian po błędzie i rozwiązywanie konfliktów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wycofywanie zmian po błędzie i rozwiązywanie konfliktów”?
Przywracać poprzedni stan po nieudanej mutacji i poprawnie obsługiwać odrzucone przez serwer zmiany optymistyczne Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć React Academy?
Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Wycofywanie zmian po błędzie i rozwiązywanie konfliktów”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?
Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Czym jest optymistyczny interfejs i kiedy go używać
- Ręczne implementowanie optymistycznych aktualizacji
- Wycofywanie zmian po błędzie i rozwiązywanie konfliktów
- Wzorce optymistyczne z React Query i Zustand