Webowa aplikacja w wersji offline

0

Witam,
czy ktoś zetknął się z powyższym tematem? Chodzi mi o dwie sytuacje:

  1. 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.
  2. 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.

0

odnośnie ad1 to jest akurat banalne i można na spokojnie korzystać z czystego javascriptu bo zbytnio więcej tam nie zrobisz http://magazynt3.pl/czym-jest-localstorage-i-jak-je-wykorzystac-z-html5/

1

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