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 * |
#2 · Zasláno: 17. 5. 2020, 13:20:43
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 |
#3 · Zasláno: 17. 5. 2020, 14:57:54
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 |
#4 · Zasláno: 18. 5. 2020, 10:36:30
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 * |
#5 · Zasláno: 18. 5. 2020, 22:14:26
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 |
#6 · Zasláno: 21. 5. 2020, 08:28:37
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. |
||
Časová prodleva: 4 roky
|
0