Autor Zpráva
Medvídek
Profil
Až doteď sem si myslel, že skript funguje bez problému, když jsem zjistil, že pokud dojde k selhání, tak už se funkce znova nenačte. Potřeboval bych, aby se ta funkce vykonávala i pokud dojde k chybě v požadavku, prostě se provedl timout a funkce se zavovala znova.

Ukázka zde: http://69.party-akce.cz/ajaxis.php
Chyba: http://69.party-akce.cz/chyba.jpg

Zdroj. kód:
<script>
   function dotaz15() {
    $.getJSON('testovaci.php?part='+Math.random(), function(out){
      $('#hlavicka_15').text(out.hlavicka);
      $('#blok_15').html(out.blok);
      $('#infotext_15').html(out.info);
      $('#paticka_15').text(out.paticka);
        if(out.stav == 0) { $('#box_15, #udalost_15').removeClass('err war').addClass('rdy'); }
        if(out.stav == 1) { $('#box_15, #udalost_15').removeClass('err rdy').addClass('war'); }
        if(out.stav == 2) { $('#box_15, #udalost_15').removeClass('rdy war').addClass('err'); }
        if(out.cas == '') {var cas_15 = 30*1000;}
        else {var cas_15 = out.cas*1000}
      $('#kolik_15').html('<br />' +cas_15);
        /*
        $('#info_15').hover(
          function () {
           $('#udalost_15').css({'display' : 'block'});
           },
          function () {
           $('#udalost_15').css({'display' : 'none'});
           }
        );
        */
        $('#info_15').click(function() {
          $('#udalost_15').css({'display' : 'block'});
        });
        $('#close_15').click(function() {
          $('#udalost_15').css({'display' : 'none'});
        });
        setTimeout(function(){dotaz15();}, cas_15); 
      });
    }   
    dotaz15();
</script>
Chamurappi
Profil
Reaguji na Medvídka:
$.getJSON neumožňuje zachytávání chyb, musíš použít $.ajax a nastavit funkci do parametru error.
Medvídek
Profil
Chamurappi:
Tak jsem to přepsal na ajax:
    //var cas;
     $.ajax({
     type: "GET",
     url: "loader.php",
     data: "promenna=1&promt=3&p="+Math.random(),
     dataType: "json",
     success: function(jdata){
        $("#loader").html(jdata.promenna);
          if(jdata.chyba == 0){
           $("#loader").css({'background-color' : '#B90000'});
          }
          if(jdata.chyba == 1){
           $("#loader").css({'background-color' : 'green'});
          }
          var cas = jdata.cas*1000;
     },
     error: function (xhr, ajaxOptions, thrownError){     
                    if(xhr.status == 404) {
                     $("#loader").html("Soubor nenalezen");
                    }
                    if(xhr.status == 400) {
                     $("#loader").html("Špatný požadavek");
                    }
                    if(xhr.status == 403) {
                     $("#loader").html("Přístup zamítnut");
                    }
                    if(xhr.status == 500) {
                     $("#loader").html("Chyba serveru");
                    }
     }   
     });
     setTimeout(function(){dotaz();}, 2000);   
   }   
   dotaz();


Ale u této funkce mi zas nejde nacpat ten timoout dovnitř té funkce, aby se ten cas mohl brát z promenna ve vracenych datech.
__construct
Profil
Pokiaľ sa nemýlim tak predtým si to mal napchané v metóde success - prečo to do nej nedáš teraz?
Medvídek
Profil
__construct:
Hodil jsem to tam, ale potřeboval bych aby se ta funkce vykonávala i při chybě, čili ještě při chybě nastavit taky timout s časem, kterej bude pevně daný?

Teď si akorát nejsem jistej, jak dlouho sse čeká na odpověď skriptu. Co když budu mít v php skritp se sleepem, třeba sleep(50). To ajax bude čekat na odpověď tak dlouho, dokavad jí nedostane?
__construct
Profil
Medvídek:
Aha .. pozri si callback funkciu complete - tá sa vykoná či už pri úspechu, alebo zlyhaní. Čas pre request si môžeš nastaviť myslím cez timeout
Medvídek
Profil
__construct:

Jestli to dobře chápu:

ajax -> loader.php (Zde se třeba bude čekat na konfiguraci, která se může provádět i 15s, teprve poté odešle výsledek, ve výsledku bude i čas refreshe (json.cas) )

1) situace
Vše je v pořádku, zavolá se funkce settimeout s casem z json.cas a skript se provádí znova (třeba po 20s)

2) situace
Skript se provádí třeba 40s a stále se čeká na odpověď. Jak teď zajistit, aby se třeba po 30s, pokud neodpoví zase zavolal settimeout a opět zavolal skript.
Jde mi o situaci, abych nečekal 3 minuty na to, až odpoví skript. Prostě ho po daném časem, pokud neodpoví odstřelil a spustil znova. To si musim při každym cyklu definovat třeba proměnou sekundy a porovnávat jak dlouho se už ten požadavek zpracovává?

Tak sem ho překopal do této podoby:

function dotaz(){
     var cas = 30000;
     $.ajax({
     type: "GET",
     url: "loader.php",
     data: "promenna=1&promt=3&p="+Math.random(),
     dataType: "json",
     success: function(jdata){
        $("#loader").html(jdata.promenna);
          if(jdata.chyba == 0){
           $("#loader").css({'background-color' : '#B90000'});
          }
          if(jdata.chyba == 1){
           $("#loader").css({'background-color' : 'green'});
          }
          cas = jdata.cas*1000;
          setTimeout(function(){dotaz();}, cas);
     },
     error: function (xhr, ajaxOptions, thrownError){
             
                    if(xhr.status == 404) {
                     $("#loader").html("Soubor nenalezen");
                    }
                    if(xhr.status == 400) {
                     $("#loader").html("Špatný požadavek");
                    }
                    if(xhr.status == 403) {
                     $("#loader").html("Přístup zamítnut");
                    }
                    if(xhr.status == 500) {
                     $("#loader").html("Chyba serveru");
                    }                  
                    setTimeout(function(){dotaz();}, cas);
     }   
     });   
   }   
   dotaz();


nyní by měl pracovat s 30sekundama, pokud nedostane dřív odpověď a nepřepíše se proměnná, je to tak správně?


Edit: Tak není to správně, stejně se čeká na odpověď :(

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: