JavaScript Function undefined
2017-08-25T20:05:05+02:00
2017-08-25T20:29:06+02:00
2022-08-10T18:41:48+02:00
Bálint Nagy
Sziasztok!

Egyszerűen nem jövök rá, hogy mi lehet a probléma. Több helyen olvastam, hogy ez a miatt van, mert aszinkron a kód, de megoldást nem nagyon találtam rá:S 
Az alert kidobja a test.html tartalmát, de utána a content változóban nem jelenik meg:/ Mit néztem be ennyire?

Előre is köszi a segtítséget.

function readTextFile(file) { var rawFile = new XMLHttpRequest(); rawFile.open("GET", file, false); rawFile.onreadystatechange = function () { if(rawFile.readyState === 4) { if(rawFile.status === 200 || rawFile.status == 0) { var allText = rawFile.responseText; alert(allText) return rawFile.responseText; } } } rawFile.send(null); } var content = readTextFile(chrome.extension.getURL ("test.html"));
Mutasd a teljes hozzászólást!
Az onreadystatechange-nek nem azért kell függvényt megadni, mert az XMLHttpRequest tervezői meg akarták bonyolítani mindenki életét. Azért kell neki függvényt megadni, mert a send() hívás után közvetlenül még nem történik semmi, hanem később (lassú kapcsolat esetén sokkal később) lesz elérhető a kért adat, és akkor szüksége van valamire, aminek ezt az adatot odaadhatja.

Tehát az események ilyen sorrendben történnek:
1. Meghívódik a readTextFile
2. A readTextFile meghívja a send() metódust az XHR objektumon
3. A readTextFile visszatér (mivel nincs return utasítás benne, undefined lesz a visszatérési érték)
4. A context változó értéke a visszaadott érték lesz (tehát undefined)
5. Valamikor később lefut a readystatechange callback függvény, dobja az alertet, aztán visszaadja a kívánt szöveget. Őt viszont a böngésző hívta, és a böngésző nem törődik a visszaadott értékkel.

Az "egyszerű" megoldás az, hogy nem a readTextFile hívása után akarod feldolgozni a kapott adatot, hanem adsz neki egy függvényt, ami majd meghívódik, ha megjött az adat. Ha ezt sok rétegen keresztül csinálod, elég követhetetlen lesz, ezt hívják "callback hell"-nek. Eggyel barátságosabb a Promise objektumok használata, de ezeket én most nem fogom elmagyarázni egy hozzászólásban, Google a barátod. Elvileg majd a hatos Javascriptben lesz erre dedikált szintaxis (await ha jól emlékszem), de az még soká lesz, hogy minden böngészőben elérhető legyen.
Mutasd a teljes hozzászólást!

  • Igen, amiatt van. Használj callback függvényt az AJAX válasz feldolgozására.
    Mutasd a teljes hozzászólást!
  • Az onreadystatechange-nek nem azért kell függvényt megadni, mert az XMLHttpRequest tervezői meg akarták bonyolítani mindenki életét. Azért kell neki függvényt megadni, mert a send() hívás után közvetlenül még nem történik semmi, hanem később (lassú kapcsolat esetén sokkal később) lesz elérhető a kért adat, és akkor szüksége van valamire, aminek ezt az adatot odaadhatja.

    Tehát az események ilyen sorrendben történnek:
    1. Meghívódik a readTextFile
    2. A readTextFile meghívja a send() metódust az XHR objektumon
    3. A readTextFile visszatér (mivel nincs return utasítás benne, undefined lesz a visszatérési érték)
    4. A context változó értéke a visszaadott érték lesz (tehát undefined)
    5. Valamikor később lefut a readystatechange callback függvény, dobja az alertet, aztán visszaadja a kívánt szöveget. Őt viszont a böngésző hívta, és a böngésző nem törődik a visszaadott értékkel.

    Az "egyszerű" megoldás az, hogy nem a readTextFile hívása után akarod feldolgozni a kapott adatot, hanem adsz neki egy függvényt, ami majd meghívódik, ha megjött az adat. Ha ezt sok rétegen keresztül csinálod, elég követhetetlen lesz, ezt hívják "callback hell"-nek. Eggyel barátságosabb a Promise objektumok használata, de ezeket én most nem fogom elmagyarázni egy hozzászólásban, Google a barátod. Elvileg majd a hatos Javascriptben lesz erre dedikált szintaxis (await ha jól emlékszem), de az még soká lesz, hogy minden böngészőben elérhető legyen.
    Mutasd a teljes hozzászólást!
abcd