Autor Zpráva
nethor
Profil
Zdravím,
mám takovýhle script: jsfiddle.net/a3r74fp1 , který testuje spojení se serverem.
v případě přerušení se má zobrazit varování.
Funguje to, ale hláška se občas objeví i při opouštění stránky nabo refreshi, což je nežádoucí.

Jak se to dá ošetřit?

(Experimentoval jsem s unload a beforeunload , ale bezvýsledně.)
N71
Profil *
Browser možná přeruší probíhající request při opuštění stránky. Je otázka, jestli je vůbec potřeba takovou kontrolu dělat – zachytávej chyby funkčních požadavků, nemusíš přidávat nějaké kontrolní. Existuje taky vlastnost navigator.onLine, podle které se dá poznat, jestli je k dispozici (nějaké) připojení k síti.
Keeehi
Profil
Prozkoumal bych fail(function(jqXHR, textStatus, errorThrown) Možná že v těch proměnných bude informace proč to nedopadlo úspěšně a půjdou jednotlivé stavy od sebe rozlišit.
nethor
Profil
N71:
Je otázka, jestli je vůbec potřeba takovou kontrolu dělat
Je, protože se chybová hláška občas (když se zrovna trefí do intrvalu) zobrazí i při prokliku v menu. To je matoucí.
Funkční požadavky se vykonávají přes PHP a čeká se na ně třeba i několik s.
O navigator.onLine vím, ale chci zohlednit i možnost, že neodpovídá server.

Keeehi:
Prozkoumal bych fail(function(jqXHR, textStatus, errorThrown)
Dobrý nápad, ale statusText vrací vždy "error" a errorThrown <empty string> .
V objektu jqXHR jsou proměnné také stejné, možná by pomohla nějaká funkce.

---------------------------

Vyřešeno přes beforeunload.

Musel jsem přidat proměnnou a podmínku do těla fce fail.
Nedošlo mi, že nestačí stopnout interval.
var PingConnect2Server = true    ;
     
$(window).bind('beforeunload', function(){
    console.log("beforeUnload");    
    PingConnect2Server = false    ;
      clearInterval(Connect2Server)    ;     
});    
    
var Connect2Server = setInterval(function(){

    Ping("ping.html").done(function() {
        console.log("Ping OK")    ; 
        $(".Connect2Server").html("Spojení se serverem bylo obnoveno.").removeClass("Lost").addClass("Connected")    ;
        setTimeout( function() { $(".Connect2Server").hide(400)    ;  }, 2000);    
    }).fail(function(jqXHR, textStatus, errorThrown) {
               
        if(PingConnect2Server)     {                
           console.log("Ping Fail")    ; 
           $(".Connect2Server").html("Spojení se serverem bylo přerušeno.").removeClass("Connected").addClass("Lost").show(400)    ;
        }
        else {            
           console.log("---!PingConnect2Server---")    ; 
        }
    });
        
}, 2000)    ;  


function Ping(url){
  return $.get({ url: url, dataType: 'text', cache: false });      
}
N71
Profil *
nethor:
Funkční požadavky se vykonávají přes PHP a čeká se na ně třeba i několik s.
O tom právě mluvím. Chyby těchto požadavků jsou ty relevantní. Většinou stačí upozornit na provozní chybu, není nutné dělat ještě samostatný test.
nethor
Profil
N71:
Úlohou toho scriptu je ochránit uživatele tak, aby nepřišel o žádná data (typicky delší popisný text).
Kdybych dělal kontrolu pouze funkčních požadavků, přišel bych na chybu až když o data přijde, tedy pozdě.
Kromě toho funkcí pro ajax už mám v tom projektu řádově desítky a musel bych je všechny přepisovat/doplňovat. (a vše znovu testovat.)
Navíc, pokud chci mít info o obnovení spojení, stejně musím nějaký loop ping spustit. Takhle se o tento problém stará jedna konkrétní část scriptu.

Vyřešeno, funguje to dobře.

Díky všem.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0