Hirdetés

2024. június 3., hétfő

Gyorskeresés

Téma összefoglaló

Téma összefoglaló

  • Utoljára frissítve: 2014-02-25 10:20:57

LOGOUT.hu

JavaScript != Java (A JavaScript nem összekeverendő a Javával, két különböző programozási nyelvről van szó!)

Összefoglaló kinyitása ▼

Hozzászólások

(#6301) disy68 válasza Panhard (#6300) üzenetére


disy68
aktív tag

A data objektum mezőin kell végigmenned és azok értékeit menteni a tömbbe.

for (var property in data) {
if (data.hasOwnProperty(property)) {
// put in array: data[property]
}
}

A mentéshez használhatsz egy sima változót, amit közben növelgetsz, ami lesz a tömb indexe, vagy a mező neve alapján kezeled az indexet. Az alábbi kiszed minden szöveget pl:

function getIndex(propertyName) {
return propertyName.replace(/\D/, "");
}

“Yeah, well, you know, that’s just, like, your opinion, man.” — The Dude

(#6302) Panhard válasza disy68 (#6301) üzenetére


Panhard
tag

Köszi, de nem nagyon értem.
Ennél a megoldásnál is csinálnom kell egy for ciklust, ami 90-szer fut le? Annak a változóját hova kell betennem?
Az én megoldásomnál az lehet a hiba, hogy a "data.d0" objektumot String-ként hozom létre, és azt nem tudja értelmezni?

Most vetem észre, hogy az első hozzászólásomban elírtam egy változó nevét. Így a helyes ahogy próbáltam:

for(var i=0; i<91;i++){

var ertek = "";
ertek += "data.d";
ertek += i;
eredmeny[i] = ertek;
}

[ Szerkesztve ]

(#6303) Panhard válasza Panhard (#6302) üzenetére


Panhard
tag

Hogy lehet hivatkozni a data.d0 objektumra úgy, hogy bele lehessen tenni egy for ciklusba?

(#6304) disy68 válasza Panhard (#6302) üzenetére


disy68
aktív tag

Ennél a megoldásnál téged nem érdekel pontosan mennyi mezője van a data objektumnak. Végigmész az összesen, ellenőrzöd, hogy saját mezője-e, majd a kapott értéket a mező nevéből származó index-szel berakod egy tömbbe.

Egy egyszerű minta: fiddle. Egy kicsit korrektebb: változat.

"Az én megoldásomnál az lehet a hiba, hogy a "data.d0" objektumot String-ként hozom létre, és azt nem tudja értelmezni?"

Bizony, a legfőbb hiba ez. A másik, hogy nem rugalmas a megoldás, hiszen mi van, ha már nem 90 elemet kell feldolgozni?

Ha errefelé mennél mégis, amit nem ajánlanék, akkor valahogy így módosulna a fenti egyszerű példa.

A lényeg:

var arr = []; // eredmény
for (var i = 0; i <= 90; i++) {
var key = "d" + i;
arr[i] = data[key]; // a data objektum adott d0 .. d90 elemét így tudod megcímezni
}

[ Szerkesztve ]

“Yeah, well, you know, that’s just, like, your opinion, man.” — The Dude

(#6305) Panhard válasza disy68 (#6304) üzenetére


Panhard
tag

Köszi, ez a minta amit beszúrtál működik.Ezt fogom használni, mert egyszerű. Az elemek száma nem változik magától, csak ha változtatom. De akkor ezt is hamar át tudom írni.
Köszi mégegyszer. :)

(#6306) CSorBA válasza disy68 (#6304) üzenetére


CSorBA
őstag

Szerintem ennél a property-s checkolásnál az Object.keys egy array mappel átláthatóbb és egyszerűbb, persze csak ha nem kell IE8:

var result = [];

Object.keys(data).map(function(value, index) {
result[index] = data[value];
});

var data = {
d0: "zero",
d1: "one",
d2: "two",
d3: "three"
};

esetén:

console.log(result); // Array [ "zero", "one", "two", "three" ]

(#6307) Hunmugli válasza disy68 (#6291) üzenetére


Hunmugli
aktív tag

Igazad volt :R
Már értem miért nem jó a document.write()
De a console.log()-os megoldás sem az igazi - nem sok olyan honlapot látni, ahol a konzolt kell nézegetni :D

Amíg nem tudok jobbat, a fenti megoldást fogom használni. Az html tageket is tud értelmezni :C

A kevés tudás veszélyes. A sok is. – Bocs az offért.

(#6308) SaNyEe


SaNyEe
aktív tag

Sziasztok,

Kérdésem lenne Jscript+HTML+Ajax kombó témában, lehet béna, de ez van :)
Adott egy HTML oldal <html>-től</html>-ig.
Ajax hívásokkal ezen oldal egy részét cserélem, a cserélendő tartalom a <div id=page_modul_container">-ben van.

Amikor cserélek az így történik:
$("button").click(function(){
$.ajax({url: "index.php", method:"post", data: {func:'ajax',module:$(this).attr('id'),request:'new_instance'},
success: function(result){
$("#page_modul_container").html(result)}});
});

A betöltött tartalmon a <script> részeket mindig a html kód végén helyezem el, így működnek.

A problémám az, hogy amikor a beszúrt kódból próbálok kimutatni az eredeti részre az nem működik, a beszúrt tartalom nem "lát" a <div id=page_modul_container"> dom elem szintjére fel.
Ezen hogy lehetne segíteni?

[ Szerkesztve ]

-- end of transmission --

(#6309) martonx válasza SaNyEe (#6308) üzenetére


martonx
veterán

Pedig látnia kellene, bár nem túl elegáns dolog a beszúrt kódrészben is scripteket elhelyezni. Miért nem az alap html-be teszed az összes scriptet?

Én kérek elnézést!

(#6310) SaNyEe válasza martonx (#6309) üzenetére


SaNyEe
aktív tag

Valószínű nem volt jó valami abban a dom-nak, hogy csak belehánytam a resultot a html részébe.
Kicsit módosítottam a betöltést:

$.ajax({url: "index.php", method:"post", data: {func:'ajax',module:'register',request:'new_instance'},
success: function(result){
$("#page_modul_container").html("");
$('<div></div>').html(result).appendTo('#page_modul_container');
}});

Így működik, igaz most van egy extra divem, de ezzel szerintem tudok élni :DDD
Azért írtam a scriptet a kódrészbe, mert "önmagukban teljes" osztályokat írok modulonként.
Írhatnám külön script fájl(ok)ban is és linkelhetném a head részben ez igaz, de ezt a módszert választottam :)

-- end of transmission --

(#6311) PumpkinSeed


PumpkinSeed
addikt

Az mitől van, hogy van egy függvényem, amiben ennyi van:

function addSchool() {
addSchool = document.getElementById('add-schools');
schools = document.getElementById('schools');
schoolList = document.getElementById('school-list');
}

Ezt egy onClick eseményre tettem. Amikor elsőnek rákattintok, probléma nélkül lefut. Mikor másodjára kattintok akkor ezt a hibaüzenetet kapom: Uncaught TypeError: addSchool is not a function

[ Szerkesztve ]

"Akinek elég bátorsága és türelme van ahhoz, hogy egész életében a sötétségbe nézzen, elsőként fogja meglátni benne a fény felvillanását." - Kán

(#6312) fordfairlane válasza PumpkinSeed (#6311) üzenetére


fordfairlane
veterán

Mert ugyanolyan nevű globális változót használsz a függvényen belül objektumreferencia tárolásra, mint ami a függvényed neve.

x gon' give it to ya

(#6313) fordfairlane válasza fordfairlane (#6312) üzenetére


fordfairlane
veterán

function addSchool() {}

ugyanaz, mint

var addSchool = function() {}

A function-on belül első hívásnál az első sor a függvény referenciáját felülírja, így másodjára már nem tudod meghívni.

[ Szerkesztve ]

x gon' give it to ya

(#6314) PumpkinSeed válasza fordfairlane (#6313) üzenetére


PumpkinSeed
addikt

Ez igen, erre se jöttem volna rá, köszi érte.

"Akinek elég bátorsága és türelme van ahhoz, hogy egész életében a sötétségbe nézzen, elsőként fogja meglátni benne a fény felvillanását." - Kán

(#6315) Keeperv85


Keeperv85
nagyúr

Sziasztok!

Remélem jó topicban... :B

Adott egy Greasmonkey script, ami most így néz ki:

// ==UserScript==
// @name Clixgrid ads
// @namespace sdsd
// @include *http://www.clixsense.com/en/ClixGrid-Play_the_Game*
// @version 1
// @grant none
// ==/UserScript==
flag=0;
document.hasFocus = function () {return true;};
setTimeout(function(){document.getElementById('frm').src=""},0000);
reld();
function reld(){
var im=document.getElementsByTagName('img');
for(i=0;i<im.length;i++){
if(im[i].src=='http://csstatic.com/img/tick48.png'){
st=window.location.href;
num=st.substring(st.lastIndexOf('/')+1,st.lastIndexOf('?'));
num=(num>=20?1:++num);
str=num+st.substring(st.lastIndexOf('?'));
flag=1;
window.location.href=str;
break;
}
}
if(flag==0){
setTimeout(function(){reld()},4000);
}
}

Előrevetítem, hogy életemben soha sem írtam ilyen scriptet még, szóval lehet triviálisnak tűnik a kérdés majd....

Ez ugye az include alatti címen lévő játékot automatizálja, tehát magától kattintgat.... Csakhogy ez így már nem jó, mert 30-ra nőtt a lehetőségek száma (alap esetben), de a sorok száma csupán 20, így a végén mindig kihagy 10-et.

Eddig azt csinálta ugye a script, hogy, ha pl az URL:

http://www.clixsense.com/en/ClixGrid-Play_the_Game/2/2?8732697

...akkor a kiemelt számra állva elindult és azt növelte 20 lépésen át....

Most azt szeretném, hogy az az előtti, tehát az oszlopsorszámot növelje, ezt:

http://www.clixsense.com/en/ClixGrid-Play_the_Game/2/2?8732697

Ám olybá tűnik hülyének bizonyultam ehhez, mert 2 nap szívás után sem sikerül... A pozíciót megtaláltam, csak nem kicseréli a számot az én verzióm, hanem oda írja be az újat, amit szintén nem jó... :W

Légyszi segítsen valaki!

Köszi! :R

(#6316) disy68 válasza Keeperv85 (#6315) üzenetére


disy68
aktív tag

Üdv, egy regex-es lehetőség:

A String.prototype.replace(regex, replacerFunction)-t használva elég egyszerű lesz a dolog. A regexet megírod úgy, hogy lesz 3 capture group (url eleje a számig, szám, többi). A replacerFunction-ben pedig növeled a számot és összefűzöd a 3 részt az növelt számmal.

regex:
/^(http[s]?:\/\/[^\/]+\/[^\/]+\/[^\/]+\/)(\d+)(\/.*)/

replacerFunction:
var increasePart = function (match, firstPart, numberAsString, lastPart) {
var increasedNumber = parseInt(numberAsString) + 1;
return firstPart + increasedNumber + lastPart;
}

Minta.

“Yeah, well, you know, that’s just, like, your opinion, man.” — The Dude

(#6317) Keeperv85 válasza disy68 (#6316) üzenetére


Keeperv85
nagyúr

Köszi, megpróbálom összedolgozni a kettőt, ha kicsit békén hagynak az egyéb (munkahelyi... :U) feladatokkal és megírom sikerült-e! :R

(#6318) Mr Dini


Mr Dini
addikt
LOGOUT blog

Üdv!

Kezdő kérdésem lenne... Mégpedig van egy ilyen functionom:

function getPage(url){
var http = require("http");
content = http.request({ url: url, method: "GET" }).then(function (response) {
var str = response.content.toString();
console.log(str);
}, function (e) {
alert("Error!");
});
}

Namost, azt szeretném, hogy ha így meghívom:

alert(getPage('http://bing.com'));

akkor térjen vissza az oldal HTML kódjával. Namost, a console.log(str); miatt megkapom a konzolban a kódot, de nem tudom, hogy kéne a return-t berakni, hogy az alert is kiírja a kódot.... :B

Tudbátok segíteni?

Köszi! :R

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6319) Mr Dini válasza Mr Dini (#6318) üzenetére


Mr Dini
addikt
LOGOUT blog

Még így sem megy:

var DATA = '';

function getPage(url){
var http = require("http");
content = http.request({ url: url, method: "GET" }).then(function (response) {
str = response.content.toString();
console.log(str);
DATA = response.content.toString();
}, function (e) {
alert("Error!");
}); return DATA;
}

alert(getPage('http://www.vanenet.hu/'));

Egyedül a callbackes megoldásom működik rendesen:

function getPage(callback){
var http = require("http");
content = http.request({ url: URL, method: "GET" }).then(function (response) {
str = response.content.toString();
console.log(str);
callback(str);
}, function (e) {
alert("Error!");
}); return(str);
}

var URL = 'http://www.vanenet.hu';
getPage(function(result){ alert(filmName +result);});

Viszont én meg nem szeretném ezzel a function(result)...-tal meghívni a függvényt, hanem annak a helyére a linket szeretném megadni és azt szeretném, ha a DATA változóban lenne a HTML kód.

Egyébként node JS-t használok.

Már a hajam égnek áll ettől! :(((

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6320) Jim-Y válasza Mr Dini (#6319) üzenetére


Jim-Y
veterán

Szia,

Ami neked kell az, hogy utananezz az aszinkronitasnak es a promisoknak javascriptben, mert igazabol ilyen jellegu a problemad.

Javascriptben a legtobb network hivas aszinkron, vagyis a hivas eredmenye valamilyen jovobeli idopontban lesz csak meg, es mivel a nyelv kornyezete tamogatja az ilyen jellegu hivasokat aszerint is kell kezelni oket. Ennek megkonnyitesere vannak a promisok amiket te mar hasznaltal is a kododban csak valoszinuleg rosszul.

az alert(getPage(valami)) mar csak azert sem mukodhet, mert ezzel a sorral azt feltetelezed, hogy a getPage szinkron fuggveny pedig nem az!

Pszeudokod:

function getPage(url) {
return http.request({ url: url, method: "GET" });
}

function yourLogic() {
const URL = 'http://www.vanenet.hu';
getPage(URL)
.then(function (response) { alert(response); })
.catch(function (err) { console.error(err); })
}

(#6321) Mr Dini válasza Jim-Y (#6320) üzenetére


Mr Dini
addikt
LOGOUT blog

Azt szeretném elérni, hogy ha bárhol kiadom a kódban a getPage('http://urlcím'); -et, akkor a DATA globális változóban ott legyen az adott oldal forráskódja.

Pl xhr, ami régen használtam, viszont gondolom node js-nél a CORS miatt nem megy:

var DATA = '';
function getPage(url){
http = new XMLHttpRequest();
http.open("GET",url, false);
http.send();
DATA = http.responseText;
}

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6322) tick válasza Mr Dini (#6319) üzenetére


tick
aktív tag

Ha ez egy játszós project, akkor használhatsz sync megfelelőt, pl http-sync.
Viszont az egész nodeJS lényege hogy non-blocking async. Minden sync function egy pofon a teljesítménynek, ugyanis addig minden más várakozik.

Everything that has a beginning... has an end

(#6323) Jim-Y válasza Mr Dini (#6321) üzenetére


Jim-Y
veterán

De ezt nem tudod megcsinalni, mert az asynchronous non-blocking I/O ahogy a javascriptet illetni szoktak lenyege pont az, hogy az async operationok nem blokkoljak a vegrehajtasi szalat. Magyaran, beallithatod te az XHR-t szinkronra, hogy amikor az mondod, hogy getPage(xyz) akkor az eredmeny rogton a DATA-ban legyen, de akkor az egesz javascript/nodejs filozofialval szembe mesz es amugy is ilyet nem csinalunk. Nem veletlenul minden async... Tenyleg javaslom hogy olvasgass kcsit a temaban, mert ugy tunik, hogy nem erted kristaly tisztan hogy hogy is mukodik a javascriptben az async.

Magyarazat:

a getPage belul egy requestet hasznal ami egy http keres lesz egy szerverre, amig erre a http keresre nem erkezik valasz addig NEM SZABAD blokkolni a stacket mert a javascript egy vegrehajtasi szallal (egy stackel) rendelkezik es minden UI is ezen "fut". Ha te egy szinkron kerest csinalsz, mint amit pont most szeretnel elerni akkor egez addig amig a tavoli szerver vissza nem ter addig SEMMIT sem tudnak a felhasznalok csinalni az oldaladon. Mondanom sem kell, hogy ez az egyik legnagyobb antipattern. Helyette aszinkron kell a tavoli szerver kerest kezelni. Vagyis... elinditod a kerest, majd rogton "visszaadod a vezerlest a fo szalnak" persze javascript eseten nincs ertelme ennek a mondatnak de igy konnyebb elkepzelni. Ami tenylegesen tortenik az az hogy amikor elinditasz egy requestet akkor a webapi regisztral egy callbacket amit tcp socket valasz eredmenyevel fog meghivni. Promiszok eseten a callback egy rezolvalt promis lesz.

(#6324) dqdb válasza Mr Dini (#6321) üzenetére


dqdb
nagyúr

Széllel szemben nehéz lesz ;]

Az egész Node.js éppen az aszinkron működésre épít, így minden esetben, amikor nem aktívan dolgozol, hanem valami erőforrásra vagy eseményre vársz, legyen az hálózatról adat lekérése, fájl írása* vagy adatbázis-művelet, mindig egy callbackben kapod meg a végeredményt. Ennek az az oka, hogy a szinkron várakozás blokkol egy feldolgozószálat, és csökken a szerver feldolgozási képessége, míg aszinkron esetben az adott szál lazsálás helyett értelmes munkára is befogható, vagyis egy másik kérés feldolgozására. Most mondhatod, hogy de te ezt nem kérted, azonban azzal, hogy a Node.js alapon álltál neki, pont egy aszinkron, threadpool alapú hatékonyan skálázódó platformra esett a választásod, így vagy megszoksz, vagy megszöksz ...

Kókányolni szerencsére sajnos minden platformon lehet, így itt is, és valószínűleg ezt keresed (nem használtam soha, keresés dobta ki). De itt sem nem véletlenül kezdődik a leírás a Githubon elérhető legnagyobb betűméretű bekezdéssel, hogy miért ne használd ezt a libraryt.

viszont gondolom node js-nél a CORS miatt nem megy
A CORS böngésző szintjén értelmezhető csak. A Node.js azért nem támogatja az XHR-t, mert saját API-ja van, nem a böngésző DOM modelljét másolja.

* ebből kivételesen létezik szinkron API is, de ennek ellenére a aszinkron felület felé terelnek a hivatalos dokumentációban:

"In busy processes, the programmer is strongly encouraged to use the asynchronous versions of these calls."

tAm6DAHNIbRMzSEARWxtZW50ZW0gdmFka5RydIJ6bmkuDQoNClOBc4Ek

(#6325) Mr Dini


Mr Dini
addikt
LOGOUT blog

Köszi a válaszokat! :R

Értem is nagyjából, hogy mi a probléma, csak azt nem tudom, hogy akkor a parserem hogy rakjam össze, ami HTML kódokból olvas ki infókat... Ezt a http-sync-et meg nem lehet feltenni nativescript-re....

Szvsz, ez a kód működik, úgy gondolom innen kiindulhatnék, csak én ehhez kevés vagyok:

function getPage(callback){
var http = require("http");
content = http.request({ url: URL, method: "GET" }).then(function (response) {
str = response.content.toString();
console.log(str);
callback(str);
}, function (e) {
alert("Error!");
}); return(str);
}

var URL = 'http://www.vanenet.hu';
getPage(function(result){ alert(filmName +result);});

Mint mondtam, csak annyit kéne rajta alakítani, hogy ne alertben dobja ki a forrást, ne is a konzolban, hanem a DATA változóban, amit utána a "fő szálon" lehetne parsolni. Meg hogy ne külön kelljen az URL-t deklarálni, hanem a getPage functionnel. Értsd:

getPage('http://valami url');

[ Szerkesztve ]

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6326) Mr Dini


Mr Dini
addikt
LOGOUT blog

No, akkor másképp közelítem meg a dolgot!

Ma éjfélig kész kell lennem egy mindegy, h milyen, csak működő tákolmánnyal, ami fut androidon appként. A lényeg, hogy működjön, később majd úgyis faragok rajta. Meg egy droid appnál az a kis várakozási idő szerintem amúgy is belefér...

Olvastam valahol, hogy itt is lehet xhr-t használni. Ez érdekelne, de hogyan?

[ Szerkesztve ]

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6327) tick válasza Mr Dini (#6326) üzenetére


tick
aktív tag

Ha megosztod mit kell csinálni a az appnak, könnyebben tudunk szerintem segíteni hogy kéne kinéznie async felhasználásával :)

Everything that has a beginning... has an end

(#6328) Mr Dini válasza tick (#6327) üzenetére


Mr Dini
addikt
LOGOUT blog

Adatokat szeretnék kinyerni egy HTML kódból, aki dinamikus és egy szerveren futó php rakja össze.

Pl időjárási adatokat szeretnék leszedetni és feldolgozni.

A többit meg már elmondtam. Lehet bármilyen a function, csak getPage('url');-lel lehessen meghívni és a DATA globális változóban adja vissza a html kódot. A kód nár működött xhr-rel, böngészőben, de a node -on nem akar menni a jóöreg xhr.

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6329) fordfairlane válasza Mr Dini (#6328) üzenetére


fordfairlane
veterán

A http csomag szerintem ebben a formában sohasem fog működni, úgy nézem, egyáltalán nincs szinkron üzemmódja. Vagy használj más csomagot, pl. az említett http-syncet, vagy ne így dolgozd fel a kapott kódot, hanem egy calbackben, vagy promise resolveban.

x gon' give it to ya

(#6330) Mr Dini válasza fordfairlane (#6329) üzenetére


Mr Dini
addikt
LOGOUT blog

Próbáltam már azt is, de nem megy fel rendesen:

gyp info spawn args '-Goutput_dir=.' ]
gyp: binding.gyp not found (cwd: /home/Pisti/Asztal/testing) while trying to load binding.gyp
gyp ERR! configure error
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack at ChildProcess.onCpExit (/usr/local/node-v4.6.1-linux-x64/lib/node_modules/node-gyp/lib/configure.js:305:16)
gyp ERR! stack at emitTwo (events.js:87:13)
gyp ERR! stack at ChildProcess.emit (events.js:172:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12)
gyp ERR! System Linux 4.4.0-45-generic
gyp ERR! command "/usr/local/node-v4.6.1-linux-x64/bin/node" "/usr/local/node-v4.6.1-linux-x64/bin/node-gyp" "rebuild"
gyp ERR! cwd /home/Pisti/Asztal/testing
gyp ERR! node -v v4.6.1
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok

És meghal a telepítés...

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6331) tick válasza Mr Dini (#6328) üzenetére


tick
aktív tag

Feltételezem express-t használsz.
A kódod http kérés utáni részét (res.send-el együtt) mozgasd át a callback functionbe, úgy mennie kéne.

Everything that has a beginning... has an end

(#6332) Mr Dini


Mr Dini
addikt
LOGOUT blog

Egyébként hogy lehet az, hogy a console.log(str); kiírja a HTMl kódot itt, de a DATA globális változóba már nem tudja belementeni?:

var DATA = '';

function getPage(url){
var http = require("http");
content = http.request({ url: url, method: "GET" }).then(function (response) {
str = response.content.toString();
console.log(str);
DATA = str;
}, function (e) {
alert("Error!");
});
}

getPage('http://vanenet.hu');
alert(DATA);

Na, itt az utolsó alert(DATA); már üres... :W :F

#6331

Nem, nem használok express-t. Sima nativescript.

[ Szerkesztve ]

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6333) CSorBA válasza Mr Dini (#6332) üzenetére


CSorBA
őstag

Sajnos nem érted, amit itt többen is írtak.

A .then callbackjében lévő rész egész egyszerűen később fut le, mint az alerted. Ezért az alertedben soha sem fogod elérni. Ha csinálnál egy függvényt, amibe berakod az alertet és azt hívod meg a .then callbackjében, akkor már megy, hiszen ez akkor hívódna meg, mikor már az async műveletnek van eredménye.

(#6334) Mr Dini válasza CSorBA (#6333) üzenetére


Mr Dini
addikt
LOGOUT blog

De én pont nem ezt szeretném. A függvény csak "kódrövidítés" szempontjából lenne szükséges. És nem a függvényen belül szeretném az adatokat kiíratni, hanem "kint".

Illetve nem alerteket, hanem elég hosszű replace-ket regex-ekkel használnék...

S ezt a getPage-t én csak a HTML kód leszedésére használnám. Nem egyszer, hanem sokszor a kódban...

Egyébként kinek az ötlete volt egy get kérést aszinkronnak keresztelni? Ott a legtöbb esetben pont az a lényeg, hogy megvárja, míg végez a letöltés... És ez eddig minden programnyelvben, amivel eddig találkoztam mind így volt. De ha callbackkel meg lehet csinálni, kérem valaki dobjon már össze egy példát nekem, ami stimmel a leírásomra! Nagyon hálás lennék! :R

[ Szerkesztve ]

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6335) CSorBA válasza Mr Dini (#6334) üzenetére


CSorBA
őstag

De a JavaScript nem így működik. A JS egy szálon fut. Ha valami külső dologra (async) kell várnia, akkor nem állhat le. Ugrik a következő sorra. Hát gondolj bele, ha valami hiba történne, vagy lassú lenne a net, akkor addig állna, míg be nem tölt valamit? És az állt úgy kell érteni, hogy addig semmit sem tudsz csinálni. Épp ezért egy ilyen asyncron kérés visszatér egy promissal, ami ha resolválódik. (Teljesül az ígéret) akkor meghívja a jövőben azt a függvényt, ami erre várt.

Az általad hozott példát valahogy így lehetne használni:

function getPage (url) {
'use strct';
return new Promise((resolve, reject) => {
const httpLibrary = url.startsWith('https') ? require('https') : require('http');

httpLibrary.get(url, (response) => {
const body = [];

response.on('data', (chunk) => body.push(chunk));
response.on('end', () => resolve(body.join('')));

}).on('error', (error) => {
console.log('Error!', error.message);
});
});
}

getPage('http://vanenet.hu').then((html) => doWhateverYouWantWithHTML(html));


function doWhateverYouWantWithHTML (html) {
console.log(html);
}

A doWhateverYouWantWithHTML-be írod amit szeretnél csinálni, és ez akkor hívódik meg, mikor betöltődött sikeresen a page, amivel meghívtad a getPaget.

Szerk.: De ahogy látom Jim-Y fórumtárs is erre próbált fentebb rávezetni, egy hasonló példával.
Tényleg olvasgass a témában, nem feltétlen egyszerű, de mindenkinél van egy pillanat mikor átkattan és megérti.

[ Szerkesztve ]

(#6336) Mr Dini válasza CSorBA (#6335) üzenetére


Mr Dini
addikt
LOGOUT blog

Köszi!

És ha a doWhateverYouWantWithHTML nem function, hanem kód? Mert pont ez a problémám. Nem csak egyszer, egy link esetében szeretném feldolgozni az adatokat, hanem több helyen. Ahol mindegyik linknek más a kódja, tehát másnak kell lefutnia. Amit nem tudok function-be tenni... Konkrétan pl replace-t, vagy splitet szeretnék a változókon végrehajtani.

Nem akarom én ezt túlbonyolítani... A lényeg, hogy van egy függvényem, annak küldök egy linket, majd egy DATA változóban visszatér a HTML kódja az adott oldalnak. Erről a HTML oldalról pedig megint leszedek egy link HTML-t, azt is feldolgozom stb...

Ja és van amikor a több link közt case-t is használok, hogy eldöntse a forráskód alapján, hogy éppen melyiket kell használnia... Namost ezt egy functionbe beilleszteni átláthatatlan lenne és újra kéne írnom a már xhr sync-kel működő viszonylag hosszú kódot.

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6337) CSorBA válasza Mr Dini (#6336) üzenetére


CSorBA
őstag

A function is kód. :)

De sejtem mire gondolsz és akkor valami ilyesmi kell neked:

getPage('http://page1.hu').then((html) => doWhateverYouWantWithPage1(html));
getPage('http://page2.hu').then((html) => doWhateverYouWantWithPage2(html));
getPage('http://page3.hu').then((html) => doWhateverYouWantWithPage3(html));

function doWhateverYouWantWithPage1(html) {
// code1
}
function doWhateverYouWantWithPage2(html) {
// code2
}
function doWhateverYouWantWithPage3(html) {
// code3
}

Sokáig lehet ezt ragozni, de más megoldás erre nincs, a JS így működik. És azt is elhiheted, hogy ez a logikus és átlátható mód. Ha nem tetszik, akkor csinálhatod PHP-val és CURL-el mondjuk.

(#6338) Mr Dini válasza CSorBA (#6337) üzenetére


Mr Dini
addikt
LOGOUT blog

Értem. Szerintem előkeresem a fehér zászlót, mert sajnos azt, amit konkrétan meg szerettem volna csinálni, azt function-ökön keresztül nem lehet megoldani sajnos. Vagy ha igen, akkor számomra csúnyán csak. Azt meg nem szeretném, hogy van egy kód, amit pár hét után előveszek és csak pislogok, hogy mivaaan!?

Php és curl azért nem megoldás, mert ahogy mondtam, ez egy Android/iOS appnak indult, nativescript-tel. Csak, ha ezt tudom, nem szenvedek el feleslegesen két napot a GUI gyártással...

A vége mégiscsak az lesz, hogy java-ban írom meg és csak androidra! :(

Köszi mindent Nektek, rendkívül tanulságos volt ez a lecke! :))

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6339) Jim-Y válasza Mr Dini (#6338) üzenetére


Jim-Y
veterán

Egyetlen egy dolog ami hatraltat teged, hogy foggal korommel ragaszkodsz ahhoz, hogy "fusson le a getPage es az eredmenyt irja bele a DATA valtozoba". Amit nem latsz at, hogy lehet olyan kodot irni, ami az eredmenyt beleirja egy globalis valtozoba, de te azt nem fogod tudni, hogy mikor tortent meg, mert az a valtozoba iras majd valamikor a jovoben fog megtortenni addig a kodod fut tovabb

Szerintem ezt mar nem lehet tovabb ragozni, nem akarsz lathatoan utanaolvasni a dolgoknak, es most felre fogod dobni a nyelvet, mert nem tudsz valamit megcsinalni, sajat hibadbol, mert kb 15perc olvasassal mar vilagos lenne szamodra is, hogy mit hibazol el.

/* 1 */ function getPage(url) {
/* 3 */ http.request.get(url).then(function (response) {
/* 5 */ DATA = response;
/* 6 */ console.log(response);
})
}

/* 2 */ getPage('asd');

/* 4 */ alert(DATA);

(#6340) Mr Dini válasza Jim-Y (#6339) üzenetére


Mr Dini
addikt
LOGOUT blog

Ez világos. Csak két nap guglizás után sem sikerült rájönni, hogy azt a globális változót hogyan lehetne csak a get után lefuttatni... :B

[ Szerkesztve ]

Eleinte angol billentzuyetet akartam. De aztán megismerkedtem a nagy 'Ő'-vel!

(#6341) Jim-Y válasza Mr Dini (#6340) üzenetére


Jim-Y
veterán

Pedig kaptal mar ra itt konkret peldat is. getPage egy promisszal ter vissza..

(#6342) CSorBA válasza CSorBA (#6335) üzenetére


CSorBA
őstag

Még annyi, hogy a 2. sort elírtam :(( 'use strict'; természetesen.

(#6343) fordfairlane válasza Mr Dini (#6340) üzenetére


fordfairlane
veterán

Még mindig nem értem, miért ilyen elképesztően fontos ez a globális változó, mintha anélkül nem lehetne programot írni.

x gon' give it to ya

(#6344) tick válasza Jim-Y (#6339) üzenetére


tick
aktív tag

es7 proposal: goto ;]

Everything that has a beginning... has an end

(#6345) sztanozs válasza Mr Dini (#6340) üzenetére


sztanozs
veterán

syntetic sugar:
var DATA = '';
function getPage(url) {
http.request.get(url).then(function (response) {
DATA = response;
console.log(response);
})
}

getPage('http://akarmi/');
while(DATA === '');
alert(DATA);

Amúgy nem értem miért nem lehet az egész feldolgozást a then-be rakni, azt kész...

[ Szerkesztve ]

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#6346) Panhard


Panhard
tag

Sziasztok!
Az miért van, hogy ez az egyszerű kis kód minden böngészőben fut, kivétel Safari és Internet Explorer?

<html><head><title></title></head><body bgcolor=#222222 onload="Getdata()">

<script>
var szaml = 0;

function Getdata(){
szaml ++;
document.getElementById("egy").innerHTML = 123;
document.getElementById("ketto").innerHTML = 456;
document.getElementById("harom").innerHTML = szaml;
document.getElementById("negy").innerHTML = szaml+1;
setTimeout('Getdata()', 500);
}
</script>


<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

<text id="egy" x="10" y="30" style="font-size: 20; fill:#ffffff">xx</text>
<text id="ketto" x="10" y="50" style="font-size: 20; fill:#77ff99">xx</text>
<text id="harom" x="10" y="70" style="font-size: 20; fill:#ff4499">xx</text>
</svg>

<br><Font id="negy" size= "4" color="#aaaaaa">xxx</Font><br>

</body></html>

Ebben a két böngészőben az SVG részen belül a text-hez nem tudja hozzárendelni az értéket? Vagy mitől lehet?

(#6347) martonx válasza Panhard (#6346) üzenetére


martonx
veterán

Mert a Safari korunk Internet Explore??? :D
Viccet félretéve (ami sajnos nem is olyan vicces), verziókat nem írtál.

Én kérek elnézést!

(#6348) fordfairlane válasza Panhard (#6346) üzenetére


fordfairlane
veterán

Az inline svg részleges támogatottsága lehet az oka:

[link]

x gon' give it to ya

(#6349) sztanozs válasza Panhard (#6346) üzenetére


sztanozs
veterán

Használj textContent-et innerHtml helyett: [link]

[ Szerkesztve ]

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#6350) Panhard válasza sztanozs (#6349) üzenetére


Panhard
tag

Tökéletes! Köszönöm szépen.

Copyright © 2000-2024 PROHARDVER Informatikai Kft.