Autor | Zpráva | ||
---|---|---|---|
RadekCZ1 Profil |
#1 · Zasláno: 10. 8. 2016, 21:56:42
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 |
#2 · Zasláno: 11. 8. 2016, 21:55:18
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 |
#3 · Zasláno: 12. 8. 2016, 07:22:24
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 |
#4 · Zasláno: 12. 8. 2016, 13:08:01
koukni na openhab, třeba to vyřeší případné bastlení :D
|
||
_es Profil |
#5 · Zasláno: 12. 8. 2016, 14:49:06
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 |
#8 · Zasláno: 12. 8. 2016, 19:21:04
_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 |
#9 · Zasláno: 12. 8. 2016, 20:48:16
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 |
#10 · Zasláno: 12. 8. 2016, 20:58:43
aDAm:
Diky znam to. Jen stim mam trochu jiny plan nez tak jak to tam pouzivaji. Minimalne ovladani slaveu. |
||
aDAm Profil |
#11 · Zasláno: 12. 8. 2016, 21:36:18
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 |
#12 · Zasláno: 12. 8. 2016, 21:43:54
aDAm:
Ahoj muzem o tom pokecat na fb. Jmenuju se radek pavlistik. |
||
Časová prodleva: 8 let
|
0