Autor Zpráva
alt64
Profil *
Ahoj,
ve fci pro nacitani Json response vracim data, pro idalosti success pomoci return, viz>
function getJson(url,type)
{
    console.log(url);
    console.log(type);
    
    jQuery.ajax({
                url : url,
                type : type,
                dataType: "jsonp",
                success : function(data) {
                    console.log("GET Json Success: "+data);
                    console.log(data);
                    return data;
                },
                error : function(x, e) {

                    if (x.status == 0) {
                        console
                                .log('You are offline!!\n Please Check Your Network.');
                    } else if (x.status == 404) {
                        console.log('Requested URL not found.');
                    } else if (x.status == 500) {
                        console.log('Internel Server Error');
                    } else if (e == 'parsererror') {
                        console.log('Error.\nParsing JSON Request failed.');
                    } else if (e == 'timeout') {
                        console.log('Request Time out.');
                    } else {
                        console.log('Unknow Error.\n' + x.responseText);
                    }

                }
            });
    
}


Pokud ale zkusim toto, je promenna test undefined, co je spatne?
var test = getJson('http://search.twitter.com/search.json?q=bacon', 'GET');
        
        console.log("UKLADAM NAVRACENA DATA" + test );
        

Moderátor Chamurappi: Tvůj projev je špatně srozumitelný, piš prosím s diakritikou.
Chamurappi
Profil
Reaguji na alta64:
Copak funkce getJson něco vrací? Žádný return => vrací undefined.
AJAX je asynchronní, nemůžeš zareagovat na odpověď serveru hned poté, co vyšleš požadavek.
_es
Profil
alt64:
Okrem rád Chamurappiho si ešte niekde pozri, na akom princípe funguje JSONP.
alt64
Profil *
NA radce 13 preci vracim data normalnim zpusobem = return.

JE to callback, nevim tak jsem to pochopil z dokumentace, nevim jak jinak by to melo byt.
Chamurappi
Profil
Reaguji na alta64:
Ale return uvnitř callbacku těžko ovlivní návratovou hodnotu jiné funkce (která už navíc dávno doběhla).
_es
Profil
alt64:
NA radce 13 preci vracim data normalnim zpusobem = return.
V riadku 13 ale príkazom return nekončí funkcia getJson, ale tá vnorená funkcia. S JSONP sa pracuje inak, než s normálnym AJAXom, máš to aj dokumentácii jQuery. Okrem toho je v princípe nezmyselné, aby callback funkcie vracali nejaké dáta.
alt64
Profil *
a nemohl by mi tedy nekdo prozradit, jaky je tedy spravny zpusob? Chtel bych mit zkratka univerzalni fci, ktera z daneho URL nacte json, ulozi do objektu a ten vrati. Z dokumentace k jquery jsem tedy zadny takovy postup nevycetl a to to nehledam uz poprve..
Chamurappi
Profil
Reaguji na alta64:
fci, ktera z daneho URL nacte json, ulozi do objektu a ten vrati
To je nesmyslné zadání, jdoucí proti principu asynchronní komunikace.
_es
Profil
alt64:
ktera z daneho URL nacte json
Z URL s inou doménou, ako napríklad tá služba Twitteru?
alt64
Profil *
A jak se to tedy resi? Preci je nesmysl, abych na kazde volani kdy potrebuji neco fetchnout z Json vystupu psal pokazde samostatne volani..mozna to zni divne ale nechapu, jak by se to takovy kod pak udrzoval, pokud by to neslo..

v dokumentaci je napsano, ze success je callback, pokud vse probehlo O.K, pokud vse probehlo O.K a data mi to vrati jako objekt, jak je tedy mam vratit do nejake fce, ktera tuto fci zavolala?
_es
Profil
alt64:
jak je tedy mam vratit do nejake fce, ktera tuto fci zavolala?
No ale tá funkcia je práve tá callback funkcia a slúži práve na to, aby si si s dátami zo servera mohol robiť čo len chceš. Priraďuješ ju v 10. riadku, no pre daný účel nesprávne, lebo pre JSONP treba postupovať inak než pri normálnom AJAXe.
alt64
Profil *
Dobre, zeptam se jinak nebo tu porad budeme mluvit o necem neurcitem..

Jak ma tedy prosim vypadat univerzalni fce, ktera by mi ten objekt data vratila fci, ktera ji zavola??
_es
Profil
alt64:
ak ma tedy prosim vypadat univerzalni fce, ktera by mi ten objekt data vratila fci, ktera ji zavola?
Na to si už v [#8] odpoveď dostal.

nebo tu porad budeme mluvit o necem neurcitem
To by si si potom ale mal niečo neneurčité naštudovať a menej neurčito sa pýtať. Neodpovedáš, či ide o dáta z toho istého alebo iného servera, no vyzerá to, že sa asi pokúšaš o JSONP, tak môžeš začať tu.
alt64
Profil *
V bodu 8 jsem moc odpoved nedostal, pokud to tak je, tak bych to pochopil tak, ze tedy neni takto mozne pripravit zadnym zpusobem univerzalni fci? Pokud ano, jak by tak zhruba mela spravne vypadat? Mohl by jsi rici?

Co se tyce JSONP nemusi to byt nutne JsonP, muze to byt i uplne klasicky json..
_es
Profil
alt64:
muze to byt i uplne klasicky json
Z cudzieho servera nemôže.
alt64
Profil *
To je ale ted jedno, ja jsem se tu ptal kvuli tomu abych vyresil problem a podival se, jak se to ma delat spravne, ne tu bezvysledne debatoval..
_es
Profil
alt64:
abych vyresil problem
Aký problém? Nič konkrétne si tu nedal. Čo má ako tá výsledná aplikácia robiť? Majú sa dáta načítať s toho istého, alebo z cudzieho servera? - To určite nie je jedno. Ak z cudzieho, je výstup z neho v správnom tvare, či ide konkrétne o tú službu Twitteru? ...?
alt64
Profil *
Jaktoze nedal? To je snad uplne jedno, co ma aplikace delat snad ne? Aplikace zrovna ted bude nacitat z ciziho, priste mozna z vlastniho, to je fuk proste. Ja Vim, ze musim pocitat s cross- domain privacy pro to m requestu. Moje otazka ale znela, jak udelat univerzalni fci pro nacitani dat z Json zdroj, takovou fci jsem nastrelil, zajimalo jen, jak vratit ty data do jine fce abych nemusel psat X krat podobnou fci, vubec nic vic..
_es
Profil
alt64:
zrovna ted bude nacitat z ciziho, priste mozna z vlastniho, to je fuk proste.
Nie je to „fuk“, na oba prípady sa používajú v princípe výrazne odlišné postupy a ak ide o cudzí server, tak musí vracať JS kód, aj to len v špeciálnom tvare, nie obyčajný text ako pri JSON, teda „univerzalni fci pro nacitani dat z Json zdroj“ je pre cudzí server neriešiteľná. Dáta z adresy http://search.twitter.com/search.json?q=bacon sú pre JS na stránke s inou doménou nedostupné, ako treba tú adresu a JS kód upraviť (upraví automaticky jQuery), máš v tom odkaze na wikipédiu.
alt64
Profil *
Data jsou dostupna, je to normalni objekt, normalne je prochazim v debuggeru a vypisuji je, ostatne, to je take duvod, proc Twitter to API ma. Neverim, ze nelze v tomto pripade udelat nejakym zpusobem univerzalni fce..
Navic, v pripade mobilni aplikace je celkem jednoduche nacit z cizi domeny klasicky JSON vystup, sam to v nekolika aplikacich pouzivam, to uz jsme zase ale uplne jinde...

Cela takhle diskuze je absolutne zbytecna, jelikoz ty se ocividne patlas ve vecehc, na ktere se nikdo neptal..

Kdybych se proste jen zeptal, jak vratit objekt z vnorene fce v callbacku, tak bych asi udelal lepe..
_es
Profil
alt64:
Data jsou dostupna
To sú, ale v JS kóde v stránke na inej doméne sa nijako neuložia, ten JSON objekt sa načíta a hneď zanikne a potom nie je prístupný.

to je take duvod, proc Twitter to API ma
A má aj v dokumentácii, ako musíš tú adresu upraviť, aby boli v JS na inej doméne tie dáta prístupné. (upraví automaticky jQuery)

jak vratit objekt z vnorene fce v callbacku
Ako ho chceš stále kam vracať? Však ho spracuj v tej callback funkcii, na to predsa slúži - po úspešnom načítaní dát ti ju prehliadač automaticky zavolá. Máš v tom asi zmätok - tá vnorená funkcia je callback.
alt64
Profil *
_es:
tá vnorená funkcia je callback

Ano, to vim..ale me proste nejde za boha do hlavy, proc by nebylo mozny to vrati jako objekt, dyt si predstav, jak by to bylo desne nepohodlne porad psat ty same bloky kodu jako..

 
    jQuery.ajax({
                url : url,
                type : type,
                dataType: "jsonp",
                success : function(data) {
                    console.log("GET Json Success: "+data);
                    console.log(data);
                    return data;
                },
                error : function(x, e) {
 
                    if (x.status == 0) {
                        console
                                .log('You are offline!!\n Please Check Your Network.');
                    } else if (x.status == 404) {
                        console.log('Requested URL not found.');
                    } else if (x.status == 500) {
                        console.log('Internel Server Error');
                    } else if (e == 'parsererror') {
                        console.log('Error.\nParsing JSON Request failed.');
                    } else if (e == 'timeout') {
                        console.log('Request Time out.');
                    } else {
                        console.log('Unknow Error.\n' + x.responseText);
                    }


Proc proste na tohle nenapsat jednotnou fci a nevracet, nebo neukadat nekam ten objekt?


To jako chces rici, ze to mozne neni?
Chamurappi
Profil
Reaguji na _es:
ak ide o cudzí server, tak musí vracať JS kód, aj to len v špeciálnom tvare, nie obyčajný text ako pri JSON
Při dataType: "jsonp" vlepí jQuery na konec adresy &callback=něco a pak si to něco zkusí odchytnout. Hledací služba od Twitteru umí na callback zareagovat tak, že vrátí volání funkce.


Reaguji na alta64:
Preci je nesmysl, abych na kazde volani kdy potrebuji neco fetchnout z Json vystupu psal pokazde samostatne volani
Není to nesmysl. Je to realita.

nechapu, jak by se to takovy kod pak udrzoval
Možná si neuvědomuješ, že i celé funkce si jde předávat jako argumenty. Prakticky libovolná konstrukce jde postavit i přes callbacky tak, že se v ní dá vyznat.

Co se tyce JSONP nemusi to byt nutne JsonP, muze to byt i uplne klasicky json..
JSON bez P opravdu nemůžeš načítat z cizí domény.
_es
Profil
Chamurappi:
vrátí volání funkce
Teda vráti špeciálny JS kód - to som už písal.
alt64: A tú funkciu musíš mať vopred definovanú, aby to nejak fungovalo a musí to byť globálna funkcia. (spraví to automaticky jQuery: [#26])

vlepí jQuery na konec adresy &callback=něco
Celkom si tým istý nie som, používajú všetky služby na tento účel parameter nazvaný callback? No jednoduchšie a istejšie je asi priamo zavolať správnu adresu, než sa spoliehať na nejakú automatickú úpravu adresy cez jQuery. No volá sa iná adresa, než tá v kóde v [#1].

alt64:
Do objektu môžeš priradiť aj rovno funkciu:
{vlastnosť: názovFunkcie}
Viď aj Časté potíže, zajímavosti a poučné debaty » Rozdíl mezi voláním funkce a funkcí
alt64
Profil *
Chamurappi:
Možná si neuvědomuješ, že i celé funkce si jde předávat jako argumenty. Prakticky libovolná konstrukce jde postavit i přes callbacky tak, že se v ní dá vyznat.

Mohl by jsi prosim uvest nejaky priklad jak to udelat prosim?

Napadlo me jeste reseni pomoci kaskadoveho navaraceni hodnot z vnorene fce do vnejsi, viz:

function getJson(url,type)
{
    console.log(url);
    console.log(type);
    
    var returnValue;
    
    jQuery.ajax({
                url : url,
                type : type,
                async: false,
                dataType: "jsonp",
                success : function(data) {
                    console.log("SUCCESS GET JSON: "+data);
                    console.log(data);
                    returnValue = data;
                    return ;
                    
                    //return data;
                },
                complete : function(data) {
                    console.log("COMPLETE GET JSON: "+ data);
                    console.log(data);
                },
                error : function(x, e) {

                    if (x.status == 0) {
                        console
                                .log('You are offline!!\n Please Check Your Network.');
                    } else if (x.status == 404) {
                        console.log('Requested URL not found.');
                    } else if (x.status == 500) {
                        console.log('Internel Server Error');
                    } else if (e == 'parsererror') {
                        console.log('Error.\nParsing JSON Request failed.');
                    } else if (e == 'timeout') {
                        console.log('Request Time out.');
                    } else {
                        console.log('Unknow Error.\n' + x.responseText);
                    }

                }
            });
    
    return returnValue;
}
Chamurappi
Profil
Reaguji na _es:
Celkom si tým istý nie som, používajú všetky služby na tento účel parameter nazvaný callback?
U těch, které používají jinak nazvaný parametr, se tuším musí uvést v adrese parametr=?.

A tú funkciu musíš mať vopred definovanú, aby to nejak fungovalo a musí to byť globálna funkcia
Tu globální funkci mu vyrábí jQuery (snaží se jí dát nějaký nekonfliktní název), z ní se zavolá funkce v successu.


Reaguji na alta64:
Napadlo me jeste reseni pomoci kaskadoveho navaraceni hodnot z vnorene fce do vnejsi
Stále nechápeš. Funkce getJson ti vyšle požadavek a skončí. Vrátí obsah returnValue, tedy undefined. Pak přijde odpověď ze serveru a ta se zpracuje v callbacku success a teprve tehdy se naplní returnValue — jenže s tou už nikdo nic nedělá.
_es
Profil
alt64:
Tak potom som to asi zbytočne zamotal a jediným problémom asi bolo pochopiť, že sa majú dáta spracovať vo funkcii zadanej do vlastnosti succes toho objektu, ale tá rada tu už bola. V tej funkcii môžeš aj volať iné funkcie, tak nechápem, o akých nadbytočných blokoch kódu píšeš.

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: