Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Witam,
czy ktoś zetknął się z powyższym tematem? Chodzi mi o dwie sytuacje:
User wypełnia długi formularz - nagle traci połączenie z netem (połączenie może wrócić np za godzinę) ew traci je w miarę systematycznie (np brak zasięgu w trakcie podróży). Mimo wszystko chciałbym, aby dane zostały przechowane, a po przywróceniu połączenia przesłane na serwer.
User wypełnia formularz - wysyła request ajaxem i po 2 sekundach po wysłaniu traci połączenie (response nie zdążył wrócić) - tutaj chciałbym poinformować usera o tym że połączenie utracono i serwer nie może zwrócić odpowiedzi
Ad.1 - tutaj raczej wykorzystałbym mechanizm Local Storage z przeglądarki, lecz nie wiem jakie są obecnie najlepsze zalecane podejścia do tego tematu (może ktoś ma jakieś materiały ciekawe?)
Ad.2 - tu nie mam pomysłu.
Czy osoby które zetknęły się z powyższymi sytuacjami - mogą mi coś doradzić? Jakieś biblioteki/techniki obsługiwania tego typu sytuacji?
Może to się przyda - ale pracuję na SF3.
0
ad1 masz localStorage i sessionStorage używaj do woli
ad2 jest to aż tak kluczowe? Tego raczej nie przeskoczysz.
0
Ad1. Znasz może jakieś fajne biblioteki do obsługi tego? (rozumiem że js only)
Ad2. W sumie to tak - myślałem jeszcze, aby użyć socketów i jakiegoś error handlera ... może się sprawdzi - zobaczymy.
A nie możesz zrobić tak jak gmail i wyświetlać coś w stylu: Brak połączenia. Próba połączenia za 27 s … i po iluś próbach Nie udało się nawiązać połączenia. Wprowadzone zmiany mogą zostać utracone, a prezentowane dane mogą być nieaktualne.
Jeżeli chodzi o detekcję połączenia możesz pokombinować z tym:
$.ajax({
tryCount: 0,
retryLimit: 3,
error: function(XMLHttpRequest, textStatus, errorThrown) {
if (XMLHttpRequest.readyState == 4) {
// HTTP error (can be checked by XMLHttpRequest.status and XMLHttpRequest.statusText)
} else if (XMLHttpRequest.readyState == 0) {
// Network error (i.e. connection refused, access denied due to CORS, etc.)
this.tryCount++;
if (this.tryCount <= this.retryLimit) {
//try again
$.ajax(this);
return;
}
console.log('shit happens'); // jakiś setTimeout czy coś, który np. powtórzy się 3 razy
} else {
// something weird is happening
}
}
})
// jak 3 razy odpalisz to co wyżej to później możesz ustawić setInterval() i sprawdzać czy połączenie odzyskane jakoś tak i jak to zwróci true to odpalasz przekazanie danych na server czy cos
function hostReachable() {
// Handle IE and more capable browsers
var xhr = new(window.ActiveXObject || XMLHttpRequest)("Microsoft.XMLHTTP");
var status;
// Open new request as a HEAD to the root hostname with a random param to bust the cache
xhr.open("HEAD", "//" + window.location.hostname + "/?rand=" + Math.floor((1 + Math.random()) * 0x10000), false);
// Issue request and handle response
try {
xhr.send();
return (xhr.status >= 200 && (xhr.status < 300 || xhr.status === 304));
} catch (error) {
return false;
}
}
Pamiętaj też, że musisz w jakiś sposób rozwiązać integralność danych. Jeżeli user wejdzie w edycje jakiejś encji i Ty zapiszesz jego zmiany (do localStorage) to mogą się stać dwie rzeczy:
a) nikt w tym czasie (gdy user nie miał połączenia) jej nie edytował, więc po odzyskaniu połączenia możesz wysłać zmiany na serwer i wszystko będzie okej, jak gdyby nigdy nic
b) ktoś wyedytował tą samę encję, co nasz user bez połączenia i jeżeli wyślesz zmiany usera to mogą zacząć dziać się jakieś cyrki. Dla przykładu user bez połączenia (nazwijmy go roboczo Jan Kowalski) zabukuje pokój w hotelu A na 10 lutego, ale ponieważ nie ma połączenia, to dla reszty świata ten pokój jest nadal wolny. W czasie gdy Jan nie ma połączenia, ktoś z połączeniem również może zabukować ten sam pokój i w momencie gdy Jan odzyska połączenie, to pojawi się konflikt.
W tym wypadku proponuję użyć wersjonowania rekordów. Tutaj w 30 min Martin pokrótce opowiada o co chodzi:
(W każdym razie jak to jakoś rozwiążesz to podziel się przemyśleniami :))
1 użytkowników online, w tym zalogowanych: 0, gości: 1