Autor Zpráva
RadekCZ1
Profil
Dobrý den,
chtěl bych poprosit o radu, jsem v JS začátečník, dělám si Web rozhraní pro "Domácí automatizaci" a napsal jsem si funkce pro obsloužení tlačítek, přiřazovaní eventu, atd.
Ale právě pro obnovu dat ze serveru (GetRequest) zda je vystup ON/OFF jsem použil setInterval("Update_stav()", 200);, odpovědi ze serveru se zpracováním trvá cca 59.8ms (Timeline - Chrom) a pokud se trefím a v danou dobu kliknu na button s eventem vůbec web nereaguje. Vím že se JS vykonává v jednom vlákně, ale dá se tato situace vyřešit i jinak než Web Worker-em? Tím že worker nemá přistup ke stránce (pokud se nemýlím) by se mi značně zkomplikovala úprava už naprogramovaných funkcí.


Díky za jakoukoli radu :)
Davex
Profil
1) Nevím, jak přesně ten stav zjišťuješ, ale ve většině případů ho není nutné zjišťovat pětkrát za vteřinu.
2) Osobně bych nepoužíval setInterval, ale raději setTimeout po každém úspěšném zjištění stavu. setInterval může situaci ještě zhoršit, pokud bude server zahlcen a nebude odpovídat dostatečně rychle.
3) Ke způsobu použití si přečti něco tu: Časté potíže, zajímavosti a poučné debaty » Nepoužívejte eval, ani jeho obdoby.

Ani jedna rada asi neřeší tvůj problém, ale třeba to pomůže.
RadekCZ1
Profil
Davex:
1, JS pošle asyncrequest a Server (C# app) pošle zpět JSON s daty o výstupech a vstupech. JS po přijetí JSON vybere to co zrovna potřebuje zobrazit (např. jen kuchyň)
2, Jop to máš pravdu to předělám, ale v mém případě to nebude mít až takový vliv řekněme že na tu C# app bude max 10 lidi zároveň(nepředpokládám větší domácnosti).
3, Díky

Jinak ta servrová app potom přes RS485 komunikuje se Slave ,kde jsou Atmegy.
aDAm
Profil
koukni na openhab, třeba to vyřeší případné bastlení :D
_es
Profil
RadekCZ1:
Asi bude nejaký problém vo funkcii Update_stav - možno vyťažuje prehliadač viac než by bolo vhodné, alebo je nejako zle spravené to sťahovanie dát, alebo... niečo iné z vešteckej gule.
RadekCZ1
Profil
_es:
Ted si nejsem vědom na co narážíš, myslíš, že 60ms je na odeslání přijmutí a zpracování dat dlouhá doba? Nikdy předtím sem v JS nedělal tak nemám tušení. Diky
Pro příklad funkce zobrazující stav výstupů(prosím o shovívavost je to pro debug):
function Rooms(RoomName) {


    var text = String(httGetUni(RoomName)).replace(/\s+/g, "");    // Odeslání reguestu pro Pokoj(Kontrola přijatych dat a odstranění přebytečných mezer a řádků,atd.)

    //pokus přijtých dat parsovt na objekt JSON - datovy format
    //V připadě nekompatybylity vyhlásí hlašku v prohlížeči !!!!
    ///************V ostre verzi Alert smazat************
    try {
            JSONData = JSON.parse(text);
        } catch (exception) {

            JSONData = null;
            alert(exception);

        }

    //pokud JSONdata obsahuje nejake data pokračuje program pro tvorbu elementů
    //předešlá kontrola v přpadě že data byly nekompatibilní JSONData = null tzn. prazdne
    if (JSONData) {
        
        var pocet_zaznamu = Object.keys(JSONData.equipment).length; // zjistí počet zařízení
        if (pocet_zaznamu != 0) {
            document.getElementById("data_content").innerHTML = "<b>Zařízení:</b> <br>";     //Vyprazdním div v případě že už se něco zobrazovalo

        } else {
            document.getElementById("data_content").innerHTML = "";     //Vyprazdním div vpřipadě že přijde prázdne pole
        }

        //tvorba dynamické tabulky
        //document.getElementById("data_content").innerHTML = "";     //Vyprazdním div v případě že už se něco zobrazovalo
        var div_table = document.getElementById("data_content")
        
        var table = document.createElement('TABLE');
        table.border = 0;

        var tableBody = document.createElement('TBODY');
        table.appendChild(tableBody);

        document.getElementById("log").innerHTML = "";
        //generování tabulky zařízení s jejich stavy.
        
        var i_zaznam = 0;
        //generování prvního řádku s Názvy
        var tr = document.createElement('TR');                      //vytvoří řádek
        tableBody.appendChild(tr);                                  //přidá 1. řádek do těla tabulky
        //doplnění prvního řádku
        while (pocet_zaznamu != i_zaznam) {
            var name = JSONData.equipment[i_zaznam].name;              //zjisti nazev dané periferie

            var td = document.createElement('TD');                   //vytvoří buňku
            td.width = '75';
            td.appendChild(document.createTextNode(" " + name));     //Vyplní buňku textem
            tr.appendChild(td);



            i_zaznam++;                                              //přičte 1
        }

        //generování druhého řádku
        /*****************************
        Dodělat dosazování obrázku dle stavu a typu
        *****************************/
        i_zaznam = 0;                                               //nulovaní pomocné
        tr = document.createElement('TR');                          //vytvoří řádek
        tableBody.appendChild(tr);                                  //přidá 2. řádek do těla tabulky
        //dolnění druhého řádku
        while (pocet_zaznamu != i_zaznam) {
            var type = JSONData.equipment[i_zaznam].type;              //zjisti typ dané periferie
            var stat_type =  JSONData.equipment[i_zaznam].status;    //zjisti stav typu
            //pouze pro debug musi se přepsat pro všecky typy
            if (stat_type == "0") {
                stat_type = 1;
            }else stat_type = 0;

            var temp_name = JSONData.equipment[i_zaznam].name;
            var img = image_typ(type, stat_type)                     //zavolá funkci dosazující správný oprazek v HTML kodu
            var td = document.createElement('TD');                   //vytvoří buňku
            td.id = temp_name;
            
            var RoomNumber = GetRoomNumber(RoomName);
            if (JSONData.equipment[i_zaznam].clickable) {

                td.addEventListener("click", 
                    ChangeEqipStatus.bind(null, RoomNumber, temp_name, stat_type, type), false); //vytvoří na buňce EVENT onClick funkce bude požadovat po servru zmenu stavu
                
            }
            td.width = '75';

            td.innerHTML = img;     //Vyplní buňku textem/obrázkem
            tr.appendChild(td);



            i_zaznam++;                                              //přičte 1
        }

        //geerování třetího řádku
        i_zaznam = 0;                                               //nulovaní pomocné
        tr = document.createElement('TR');                          //vytvoří řádek
        tableBody.appendChild(tr);                                  //přidá 3. řádek do těla tabulky
        //dolnění druhého řádku
        while (pocet_zaznamu != i_zaznam) {
            var status = JSONData.equipment[i_zaznam].status;              //zjisti nazev dané periferie
            var type_stat = JSONData.equipment[i_zaznam].type;
            var literal_status = "";
            literal_status = LinStatusType(type_stat, status);
            var td = document.createElement('TD');                   //vytvoří buňku
            td.width = '75';
            td.appendChild(document.createTextNode("" +literal_status));     //Vyplní buňku textem
            tr.appendChild(td);



            i_zaznam++;                                              //přičte 1
        }

        div_table.appendChild(table);                                //přidá tabulku do DIVu



    } else {
        document.getElementById("log").innerHTML = "Chyba v datech ";
    }


}
_es
Profil
RadekCZ1:
Čo robí funkcia Update_stav, ktorú voláš v [#1] sa asi nedozvieme.
Myslím, že si nepochopil základné veci z AJAXu, konkrétne čo znamená tá „asynchrónnosť“. Pre spracovanie prijatých dát musíš zadať funkciu, ktorá bude automaticky zavolaná až vtedy, keď server vráti všetky dáta. Teda hodnota premennej text v 10. riadku v [#6] nemá nič spoločné s nejakým HTTP dotazom na server vo 4. riadku (predpokladám, že to asi nejako robí funkcia httGetUni - podľa jej názvu a komentára), lebo vtedy ešte žiadne dáta server nevrátil. Jedine že by snáď dotazy neboli asynchrónne, ako tvrdíš.

V názve funkcie httGetUni asi nejako chýba „p“ snáď to nie je nejako dôležité.
RadekCZ1
Profil
_es:
Jop, určitě je možné, že jsem si o špatně vysvětlil. Myslel jsem si, že je to dotaz na server v okamžiku, kdy stránka je už načtená a je jen doplňována/upravovaná dalšími informacemi? Budu rád když mi to vysvětlíš :) .
JS:
drive.google.com/open?id=0Bwaa8fqS7TIsekVmcmNFTUpyekU

HTML:
drive.google.com/open?id=0Bwaa8fqS7TIsUnhDdkdwdUJaNE0
aDAm
Profil
Jen ještě zopáknu: www.openhab.org tohle by mohlo řešit vše co chceš. Stači definovat položky, události atd.
RadekCZ1
Profil
aDAm:
Diky znam to. Jen stim mam trochu jiny plan nez tak jak to tam pouzivaji. Minimalne ovladani slaveu.
aDAm
Profil
Chceš se rozepsat? Já právě taky řeším projekt. Slavy na atmelu po RS485 do mastera na atmelu a z mastera mqtt na řídící server
RadekCZ1
Profil
aDAm:
Ahoj muzem o tom pokecat na fb. Jmenuju se radek pavlistik.

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: