| 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: 10 let
|
|||
0