Autor | Zpráva | ||
---|---|---|---|
KarelVS Profil |
#1 · Zasláno: 25. 12. 2013, 07:50:02
Ahoj všem,
pokorně prosím o pomoc se zpracováním JSONu v Javascriptu. Mám takovýhle JSON řetězec: var = '{ { "items": [ { "question_id": 20745762 }, { "question_id": 20737651 }, { "question_id": 20735745 }, { "question_id": 20752162 }, { "question_id": 20743901 }, { "question_id": 20746007 }, { "question_id": 20751686 }, { "question_id": 20744032 }, { "question_id": 20748848 }, { "question_id": 20749872 }, { "question_id": 20743186 }, { "question_id": 20740287 }, { "question_id": 20744387 }, { "question_id": 20744007 }, { "question_id": 20747538 }, { "question_id": 20737294 }, { "question_id": 20752781 }, { "question_id": 20743916 }, { "question_id": 20749151 }, { "question_id": 20748047 }, { "question_id": 20739574 }, { "question_id": 20738193 }, { "question_id": 20739223 }, { "question_id": 20751964 }, { "question_id": 20751870 }, { "question_id": 20745311 }, { "question_id": 20748536 }, { "question_id": 20751617 }, { "question_id": 20750749 }, { "question_id": 20752341 } ] }' Potřebuji zjistit počet výskytů question_id. Zkoušel jsem JSON.Parse(), ale pak už nevím, co s tím, protože ty jednotlivý položky jsou zase jako objekty, jestli tomu dobře rozumím. Nejsem v JS nijak kovaný, takže se omlouvám za svou neznalost :-) Děkuju! |
||
pako Profil * |
#2 · Zasláno: 25. 12. 2013, 09:11:14
Pouzi
JSON.parse a vysledok si uloz do premennej, povedzme o . Potom zistis pocet vyskytov cez vlastnost pola length ako o.items.length .
|
||
KarelVS Profil |
#3 · Zasláno: 25. 12. 2013, 09:55:53
pako ty jseš génius! :-) Já se tu s tím rozčiluju už dva dny. Co jsem přečetl článků a nic z toho.
Prozatím stokrát děkuju. Možná ještě budu mít nějakou stupidní otázku, tak bych se ještě ozval. |
||
KarelVS Profil |
Tak už jsem tu zase.
Mám tento kód: var languages = new Array("c%23","java","php","c++","javascript","python"); //c%23 = c# var counts = new Array(); for(i=0;i<languages.length;i++){ $.getJSON(url, function(json) { // získanou hodnotu uložím do pole counts[i] = json.total; }); } // jak tohle může vypsat nulu? alert(counts.length); To url vrátí třeba tenhle json: { "total": 479 } JSON stoprocentně vrací korektní čísla, mám to ověřeno. Poradíte mi prosím, proč se mi ale ty hodnoty neukládají do pole counts? Děkuju. |
||
pako Profil * |
#5 · Zasláno: 25. 12. 2013, 19:53:17
Predpokladam, ze v case, ked zistujes dlzku pola
counts , tak v nom nie su ziadne data - cyklus necaka, kym nieco nacitas zo servera.
|
||
KarelVS Profil |
#6 · Zasláno: 26. 12. 2013, 11:10:48
Tak už jsem na to přišel, ale myslel jsem, že se zblázním :-) Problém je v tom, že u jQuery funkce $.getJSON() není možné nastavit async: false, a proto musím ve svém případě použít funkci $.ajax().
Abych řekl pravdu, moc tomu nerozumím. Pokud by to někdy někdo potřeboval, přikládám nějaké odkazy, kde lze nalézt podrobnosti. Mně to pomohlo. http://sjuvekar.appspot.com/blog/19003 http://www.todayisearched.com/2010/02/jquery-getjson-async-false.html http://forum.jquery.com/topic/synchronous-getjson-request |
||
pako Profil * |
#7 · Zasláno: 26. 12. 2013, 20:40:33
Ak blokujes prehliadac, tak nema moc zmysel pouzivat ajax.
|
||
Chamurappi Profil |
#8 · Zasláno: 26. 12. 2013, 21:10:01
Reaguji na KarlaVS:
„Pokud by to někdy někdo potřeboval“ … tak mu důrazně nedoporučuji řešit to stejným způsobem, jako to řešíš ty. Synchronní AJAX je zlo poukazující na špatný návrh aplikace. |
||
Časová prodleva: 13 dní
|
|||
KarelVS Profil |
#9 · Zasláno: 8. 1. 2014, 19:02:39
Aha, tak to jste mě dostali. Já to potřeboval dodat jenom jako ukázku v semestrálce. Javascriptu nerozumím a stydím se za to.
Jakým jiným způsobem je to tedy možno řešit? |
||
1Pupik1989 Profil |
#10 · Zasláno: 8. 1. 2014, 21:16:35
Synchronni ajax je zlo jen pro ty co s ním neumí. Jsou stavy, kdy člověk nemůže bez toho načteného soubiru spustit aplikaci. Ano, jde to asynchronně, ale je tam tuna kódu navíc.
Já teď delší dobu pracuji s webgl a 2.5D v canvasu. Potřebuji načíst modely a shadery. Jak by si to Chamurappi načítal? Neber to nějak zle, není to osočování. Jsou ale fáze kdy to jinak nejde. U běžných aplikací je to samozřejmě kravina, tam to nemá moc využití. Jen mě naštvalo tvrzení, že synchronní přenos je zlo. |
||
_es Profil |
#11 · Zasláno: 8. 1. 2014, 21:27:38
1Pupik1989:
„Jsou stavy, kdy člověk nemůže bez toho načteného soubiru spustit aplikaci. Ano, jde to asynchronně, ale je tam tuna kódu navíc.“ Čo je naviac? Keď nastane úspešné načítanie súboru, bude spustená tá „aplikácia“. Z akého dôvodu by to nemohlo byť asynchrónne? |
||
1Pupik1989 Profil |
Protože to chceš zapsat nějak inteligentně a ne že spustíš aplikaci v 20. callbacku. V synchronním případě to má krásně pod sebou. Zítra můžu zvlášť můžu napsat příklad. Třeba mi pomůžete a půjde, ale já si to nedokážu představit.
Nicméně u async je už navíc ten callback. Pak se to jen obaluje a obaluje. To jsem myslel. |
||
_es Profil |
#13 · Zasláno: 8. 1. 2014, 21:52:50
1Pupik1989:
„V synchronním případě to má krásně pod sebou.“ A kvôli tomu treba „zaseknúť“ celý prehliadač až do stiahnutia dát? Či v prípade nejakej serverovej chyby ešte na dlhšie? Môžeš si „krásne“ pod to zadefinovať funkciu, ktorá bude zavolaná v tom „callbacku“. |
||
1Pupik1989 Profil |
#14 · Zasláno: 8. 1. 2014, 22:16:36
Jenže si uvědom, že reálně ve webgl můžu naćítat 20 souborů do scény. Dokážeš si představit to množství callbacků? Navíc màm timeout, který mě po nastavených sekundách odpojí.
A ano, zastavím tu aplikaci, protoże nemůže stejně bez načtených modelů běžet. |
||
_es Profil |
#15 · Zasláno: 8. 1. 2014, 22:42:14
1Pupik1989:
To, že si si to zle navrhol, je tvoj problém, no nepresviedčaj o takom návrhu ostatných. Niekedy dá veľa práce presvedčiť niekoho na správne riešenie: Využití proměné ve funkci (+ debata o sychronním AJAXu). |
||
juriad Profil |
#16 · Zasláno: 8. 1. 2014, 22:55:22
|
||
1Pupik1989 Profil |
Ano můžu čekat na všechny. Všech 20 souborů je formátu obj. Čili texturové souřadnice musím přepočítat na pixely. Takže načtu obrázky, kde převedu procentuální jednotky na pixely. Pak z toho souboru sestavím polygon list. To samé udělám 20x.
Tak a teď mi řekněte k čemu bude dobré čumět 3 sekundy na prázdné plátno? A jaký je rozdíl mezi čumění na prázdné plátno a prázdnou stránku? Upizorňuji, že ten canvas má defaultní pozadí. Pořád je to blbé? Nebo jste si prostě usmysleli či někde přečetli že je to špatně? Není, ale musíte si na to dávat bacha. Když si nejste jisti, tak na to radši ani nešahejte. Ale jak jsem psal, občas je to nevyhnutelné. Neříkám, že tak řeším vše. Co asynchronní má být, nechť je. |
||
Chamurappi Profil |
#18 · Zasláno: 9. 1. 2014, 00:35:47
Reaguji na 1Pupika1989:
„Synchronni ajax je zlo jen pro ty co s ním neumí.“ Co je s ním zapotřebí umět? Jaká magická znalost mi uniká? „Jsou stavy, kdy člověk nemůže bez toho načteného soubiru spustit aplikaci.“ To není důvod k zakousnutí prohlížeče (ani dočasnému). Jak podle tebe vypadá špatné používání synchronních požadavků, když to není ten tvůj případ? Jakým způsobem si na svůj synchronní AJAX dáváš bacha? Mně to připadá, že nad nevýhodami svého postupu prostě jen mávneš rukou… „Jsou ale fáze kdy to jinak nejde.“ Vždycky to jde. Tvá argumentace jde shrnout slovy „nechce se mi to řešit, proto to nejde“ — ukaž mi něco, co doopravdy nejde. „Jenže si uvědom, že reálně ve webgl můžu načítat 20 souborů do scény.“ Čím víc požadavků, tím je pravděpodobnější, že se jeden z nich pokazí či zakucká => o důvod víc udělat to asynchronně. Není problém za sebe poskládat nekonečno asynchronních požadavků… „Tak a teď mi řekněte k čemu bude dobré čumět 3 sekundy na prázdné plátno?“ Ukaž čumějícímu, jak probíhá načítání, nebo udržuj jeho pozornost animací. Ty tři sekundy můžou být klidně i tři minuty a já bych jako uživatel rád po chvíli čekání věděl, jestli načítání líně pokračuje, nebo jestli to umřelo a nemá cenu čekat. |
||
1Pupik1989 Profil |
Tvá argunentace jde úplně stejně shrnout slovy: "Nevím proč by to mohlo jít synchronně, proto budu tvrdit opak." Já neposílám požadavek v běhu aplikace, ale před načtením. Pouze jednou. Další důvod toho synchronního "haló" je, že to má být naprosto jednoduchoučký engine a nikdo na callbacky není zvědavý. Pravda, je lepší mít třeba o 500 volání funkcí navíc a nehledět na to, že jen za tu dobu volání callbacků se ty soubory dávno vyparsují a připraví k přidání do scény. Navíc v dnešní době máme cache.
A synchronní volání umí také vracet status. :) |
||
_es Profil |
#20 · Zasláno: 9. 1. 2014, 05:39:52
1Pupik1989:
„Pravda, je lepší mít třeba o 500 volání funkcí navíc a nehledět na to, že jen za tu dobu volání callbacků se ty soubory dávno vyparsují a připraví k přidání do scény.“ To je zase čo za nezmysel? Čo by na tom malo ísť rýchlejšie? Opak je pravdou. Asynchrónnych volaní môže prehliadač vyslať a očakávať viac súčasne, pri synchrónnom len jedno. A pri čakaní na spojenie prehliadač nerobí nič, zatiaľ čo pri asynchrónnom môže niečo robiť, trebárs nejako spracovávať dáta vrátené z iného spojenia. |
||
1Pupik1989 Profil |
Je pravda, že taková načítací smyčka mě nenapadla ani náhodou. Jde hlavně o to, že si to asi neumím tak dobře rozvrhnout.
Takže na jednom řádku načtu soubor a na dalším ho uż přidávám. Nechtěl jsem, aby ty callbacky byly viditelné. No, napíšu zvlášť vlákno, třeba to opravdu půjde lépe. edit: To předtím jsem asi nějak nedomyslel. Možná lepší příklad by byl autoloader co jsem tu řešil. Soubor se třídou není načtení. Tak ho načtu a pokračuji dál. Nemůžu pokračovat dál bez souboru, protože nastane chyba. |
||
Časová prodleva: 11 let
|
0