Avatar billede pcmalle Juniormester
11. januar 2020 - 11:08 Der er 10 kommentarer

Få data ud af long polling funktion, fra XMLHttpRequest.

Har denne kode som henter 4 værdier via en XMLHttpRequest:

function checkUpdates(url) {
    var oReq = new XMLHttpRequest(); // New request object
    oReq.open("get", "read.php", true);
 
  oReq.onload = function() {
      var myArr = JSON.parse(this.responseText);
       
        length = (myArr[0]); 
        startingTime = (myArr[1]);
        send = (myArr[2]); 
        reset = (myArr[3]);

            document.getElementById("længde").innerHTML = "Kamplængde: " + length + "min.";
        document.getElementById("starttid").innerHTML = "Starttid: " + startingTime;
        document.getElementById("send").innerHTML = "Send: " + send;
        document.getElementById("reset").innerHTML = "Reset: " + reset;
   
        checkUpdates("read.php"); 
    };
    oReq.send();
}
checkUpdates("read.php");


Det fungerer fint, men jeg vil gerne kunne bruge værdierne udenfor funktionen checkUpdates(url)

Nogen forslag?
Avatar billede Slater Ekspert
11. januar 2020 - 13:13 #1
Som i al anden Javascript-kode (og mange andre C-style sprog), hvis du vil benytte variabler uden for en funktion, skal du enten deklarere de variabler i et højere scope - altså uden for funktionen - eller returnere dem fra funktionen og sætte dem hvor du kalder den.
Avatar billede pcmalle Juniormester
11. januar 2020 - 13:53 #2
@Slater
Tak for dit svar.
Det er jeg sådan set med på. Jeg synes bare ikke lige, jeg kan få det til at fungere
i dette tilfælde.(Er ikke super rutineret i javascript endnu). Kan du evt. hjælpe mig på vej?
Avatar billede Slater Ekspert
11. januar 2020 - 14:05 #3
Kan du vise os hvor og hvordan du gerne vil bruge de værdier uden for funktionen?
Avatar billede pcmalle Juniormester
11. januar 2020 - 14:14 #4
Værdierne skal bruges i en anden funktion på siden, som skal starte en nedtællingsfunktion på et bestemt klokkeslæt.
Jeg har brug for adgang til alle fire variabler uden for selve polling funktionen.
Håber det er tydeligt nok.
Avatar billede Slater Ekspert
11. januar 2020 - 14:22 #5
Jamen så er det virkelig bare f.eks. at deklarere dem som globale variabler. Det er ikke den bedste praksis i et større system, men det er den nemmeste måde.

Lav en "var length, startingTime, send, reset;" uden for funktionen, så eksisterer de i et højere scope og kan bruges uden for funktionen. Det kan dog være en god idé at give dem et mere beskrivende navn eller prefix for at undgå kollisioner.

Selvfølgelig skal du også medregne, at fordi værdierne først sættes i et callback, vil de ikke være tilgængelige før dette er kørt. Du kan godt læse variablerne, men de vil ikke have nogen værdi endnu. Men vi kan ikke vide om det er et problem, eller hvordan det løses, ud fra hvad du viser.
Avatar billede pcmalle Juniormester
11. januar 2020 - 15:19 #6
Det fungerer desværre ikke at deklarere værdierne global, det har jeg prøvet.
Når jeg spørger på variablerne er de "undefined".
Det hænger sandsynligvis, som du også skriver, sammen med timingen mellem responsen og hvornår der spørges på værdien, men jeg kan ikke umiddelbart
få det løst.
Avatar billede Slater Ekspert
11. januar 2020 - 15:23 #7
Nej, men der er du som sagt nødt til at fortælle os om det problem du har. Her beskriver du kun udfordringen med at tilgå variablerne, hvilket så nok ikke var det reelle problem.
Avatar billede pcmalle Juniormester
11. januar 2020 - 15:32 #8
Jeg er da virkelig ked af, at jeg tilsyneladende ikke kan forklare problemet tydeligt nok.
Men det reelle problem er netop, at jeg ikke kan tilgå de "opdaterede" variabler, uden for funktionen.
Avatar billede Slater Ekspert
11. januar 2020 - 15:57 #9
Men du kan godt tilgå dem - det er sandsynligvis kun et spørgsmål om hvornår du prøver at tilgå dem. Og det problem er slet ikke beskrevet.

Det du viser i spørgsmålet er funktionen hvor værdierne sættes. Men det er nu stort set irrelevant - det der driller er stedet hvor du forsøger at benytte værdierne, og det er det vi skal have beskrevet og evt. se noget kode på.

Hvordan bliver det f.eks. startet? Bliver det sat én gang eller opdateret regelmæssigt? Hvad er det der gør, at du ikke kan nøjes med værdierne i checkUpdates funktionen, men har brug for dem uden for? Hvad er grunden til at dette overhovedet skal gøres i AJAX og ikke bare direkte i PHP under load?
Avatar billede pcmalle Juniormester
13. januar 2020 - 19:51 #10
Værdierne bliver sendt manuelt fra en formular, fra en anden side, via XMLHttpRequest over PHP på serveren.
Når de bliver hentet ind, kører funktionen checkUpdates() og venter på en ny ændring.
CheckUpdates funktionen kører i et loop og det er det, der gør at jeg ikke kan tilgå værdierne derfra, for så kaldes funktionerne jeg skal bruge også i et loop.

Grunden til brugen af AJAX, er at værdierne skal kunne indstilles på én side,
og bruges på en anden side, som står åben.

Det der indstilles, er en kamplængde, en starttid og et par ”seudo”-binære værdier,
der bruges til start og stop af en timer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester