Permalänk
Inaktiv
Skrivet av Howardtheory:

@RiviMaggot: tack så mycket för svaret!

Hur gör jag dock så jag får in de "nickname" som dom skriver in istället för
{ name: 'Kalle', time: 29 },
{ name: 'Ulf', time: 46 },
{ name: 'Frej', time: 34 },
{ name: 'Einar', time: 12 },
{ name: 'Pelle', time: 23 }

som finns inne i funktionen nu? och så det sparas med webstorage, typ local?

Jag svarade i din andra tråd ang web storage, där jag postade en jsfiddle till ett kodexempel jag slängde ihop.

https://jsfiddle.net/0h99q5Lw/2/

Permalänk

@anon14781: tack för svaret och hjälpen. Jag tänkte bara hur får man in det i min funktion showcase på bästa sett?

https://jsfiddle.net/ksL398xg/40/

har försökt, men misslyckats.

innan quizen startar så jag ett nickname man måste skriva in och en funktion där tiden räknar hur snabbt man svarar på de totala frågorna, som dyker upp i funktionen showcase, men hur får man inte localstorage och topp 5 listan med den koden du skrev på bästa sett?

Det ska liksom läggas till automatiskt, vilket det gör nu men inte i en lista och det sparas inte i https://jsfiddle.net/ksL398xg/40/ just nu.

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk

hämta fråga ur api till sajt

tjenare. det är så att jag har en skoluppgift med att göra ett quiz och hämta en fråga ur api och sedan svaret.

jag försöker hämta frågan nu med denna kod.

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() console.log(jsonQ) } // exports. module.exports = myQuiz

denna kod har jag i network.js

Sedan i app.js så kör jag let Quiz = require('./network')

console.log(Quiz)

med denna kod försöker jag hämta ut frågan ur länken i myQ för att se så det fungerar. Men när jag går in i min localhost://4000 efter jag kört npm start. Så går jag in på webbsidan, högerklickar, väljer inspektera och sedan kollar i consolen, för att se om frågan som finns i länken dyker fram, för gör den det så antar jag att detta fungerar, men när jag kör detta nu och kollar i consolen i webbläsaren så visas endast

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() console.log(jsonQ) } // exports. module.exports = myQuiz

vad gör jag för fel? Hur hämtar jag frågan ur länken? gör jag inte rätt?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem

Din modul exporterar funktionen myQuiz, och du skriver sedan ut funktionen snarare än dess resultat.

Visa signatur

AMD Ryzen 7 5800X | 32 GB Corsair Vengeance 3200 MHz | ASUS TUF Geforce RTX 3080

Permalänk

@L'ombra:

okok tack. Hur löser man detta? har försökt men inte fått till det, är ny inom detta så du vet med.

Quiz.myquiz() eller något?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem

Bara Quiz().

Visa signatur

AMD Ryzen 7 5800X | 32 GB Corsair Vengeance 3200 MHz | ASUS TUF Geforce RTX 3080

Permalänk
Medlem

Eller efter en andra koll ser jag att du redan skriver ut resultatet inuti funktionen, så du behöver inte skriva ut resultatet av funktionen, men du behöver fortfarande anropa den. Det kommer funka som det är (efter ovanstående ändring), men det är lite "onödigt".

Antingen ändrar du "console.log(jsonQ)" till "return jsonQ" eller så ändrar du "console.log(Quiz())" till "Quiz()".

Visa signatur

AMD Ryzen 7 5800X | 32 GB Corsair Vengeance 3200 MHz | ASUS TUF Geforce RTX 3080

Permalänk
Skrivet av L'ombra:

Eller efter en andra koll ser jag att du redan skriver ut resultatet inuti funktionen, så du behöver inte skriva ut resultatet av funktionen, men du behöver fortfarande anropa den. Det kommer funka som det är (efter ovanstående ändring), men det är lite "onödigt".

Antingen ändrar du "console.log(jsonQ)" till "return jsonQ" eller så ändrar du "console.log(Quiz())" till "Quiz()".

Tack för svar.
Har detta i app.js

let Quiz = require('./network') console.log(Quiz)

och detta i network.js

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() return jsonQ } // exports. module.exports = myQuiz

Efter jag testat detta och kollar sedan i consolen i webbläasren då kommer detta meddelande fram nedanför här.

async ƒ myQuiz() {
let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`)
let jsonQ = await myQ.json()
return jsonQ
}

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem

Du behöver fortfarande "Quiz()" istället för "Quiz", oavsett vad du ändrar i övrigt!

Visa signatur

AMD Ryzen 7 5800X | 32 GB Corsair Vengeance 3200 MHz | ASUS TUF Geforce RTX 3080

Permalänk
Skrivet av L'ombra:

Du behöver fortfarande "Quiz()" istället för "Quiz", oavsett vad du ändrar i övrigt!

kör på detta i app.js nu

let getQuiz = require('./network')
getQuiz()

och detta i network.js

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() console.log(jsonQ) } // exports. module.exports = { myQuiz }

funkade innan, men nu när jag satte {} mellan myquiz i module.exports så fungerar det ej, hur kommer det sig?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem
Skrivet av Howardtheory:

kör på detta i app.js nu

let getQuiz = require('./network')
getQuiz()

och detta i network.js

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() console.log(jsonQ) } // exports. module.exports = { myQuiz }

funkade innan, men nu när jag satte {} mellan myquiz i module.exports så fungerar det ej, hur kommer det sig?

{} = objekt.
myQuis blir en property i objektet som du måste kalla på.

let Quiz = require('./network') console.log(Quiz.myQuis())

Visa signatur

Ryzen 5600X | MSI Tomahawk | GTX 3070

Permalänk

@Sonywalk:

tacksam för svar!

detta ligger i min app.js

const getQuiz = require('./network')
console.log(getQuiz())

och detta i min network.js

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() console.log(jsonQ) } // exports. module.exports = { myQuiz }

dock får jag detta meddelande
Uncaught TypeError: getQuiz is not a function
at eval (app.js?3330:2)
at Object.<anonymous> (build.js:250)
at __webpack_require__ (build.js:20)
at Object.<anonymous> (build.js:83)
at __webpack_require__ (build.js:20)
at build.js:63
at build.js:66

i röd text.

tar jag bort {} runt om myQuiz i module.exports så fungerar det, men så fort jag har dom {} så verkar det inte fungera, även om jag kör med console.log(Quiz.myQuiz()).

Functionen i network.js heter myQuiz

och i app.js getQuiz.

Kan det vara då console.log(myQuiz.getQuiz())? har provat det med men verkar inte fungera.

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk

hämta ur min fråga ur api till index/app fil

Hej!

Jag behöver lite hjälp här, är ny på detta och suttit fast ett tag nu.

i app.js har jag

const getQuiz = require('./network') console.log(getQuiz())

och i min network.js har jag

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() console.log(jsonQ) } // exports. module.exports = { myQuiz }

och jag har en <div id ="questions"></div> i min index.html

som jag tänk att jag vill hämta ur första frågan ur så den skrivs ut där.

Men vet inte hur man gör riktigt, hade uppskattat om någon kan hjälpa mig med att visa lite kod.

Har försökt med skapa en variabel kört document.queryselecter('#questions')

men får inte till det riktigt så frågan hämtas ur vhost.lnu sidan till min div tag. hade uppskattat all hjälp

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem

Hej

Problemet ligger i att du ändrade från
// exports.
module.exports = myQuiz

till

// exports.
module.exports = {
myQuiz
}

därför måste du också ändra i app.js där du importerar network.js.

Kör du med module.exports = myQuiz så anropar du myQuiz funktionen såhär:
let myQuiz = require('./network');
myQuiz();

i det andra fallet anropar du myQuiz såhär:
let myQuiz = require('./network');
myQuiz.myQuiz();

Det beror på att du i det andra fallet exporterar ett objekt med propertyn myQuiz som pekar på myQuiz funktionen, men i det första fallet exporterar du endast myQuiz funktionen.

Permalänk
Medlem
Skrivet av Howardtheory:

@Sonywalk:

tacksam för svar!

detta ligger i min app.js

const getQuiz = require('./network')
console.log(getQuiz())

och detta i min network.js

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() console.log(jsonQ) } // exports. module.exports = { myQuiz }

dock får jag detta meddelande
Uncaught TypeError: getQuiz is not a function
at eval (app.js?3330:2)
at Object.<anonymous> (build.js:250)
at __webpack_require__ (build.js:20)
at Object.<anonymous> (build.js:83)
at __webpack_require__ (build.js:20)
at build.js:63
at build.js:66

i röd text.

tar jag bort {} runt om myQuiz i module.exports så fungerar det, men så fort jag har dom {} så verkar det inte fungera, även om jag kör med console.log(Quiz.myQuiz()).

Functionen i network.js heter myQuiz

och i app.js getQuiz.

Kan det vara då console.log(myQuiz.getQuiz())? har provat det med men verkar inte fungera.

Att köra console.log på resultatet av myQuiz ger dig bara något om du returnerar något från den funktionen, men det gör du inte. Du kör en console.log direkt i myQuiz istället. Här kan du testa att antingen skita i att köra console.log i app.js eller returnera jsonQ från myQuiz funktionen. Tänk bara på att den är async så du får köra await i app.js också

Permalänk
Skrivet av zybreak:

Att köra console.log på resultatet av myQuiz ger dig bara något om du returnerar något från den funktionen, men det gör du inte. Du kör en console.log direkt i myQuiz istället. Här kan du testa att antingen skita i att köra console.log i app.js eller returnera jsonQ från myQuiz funktionen. Tänk bara på att den är async så du får köra await i app.js också

tjenare.

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() let text = jsonQ.question return text } let question = myQuiz() console.log(question) let qDiv = document.querySelector('#questions') let quest = document.createElement('p') quest.innerHTML = question qDiv.appendChild(quest)

jag kör nu hela denna kod och funktion i app.js istället.

har fått ut texten till question div taggen i html, men dock blir det promise. Hur ändrar man detta, så frågan kommer ut istället för object promise?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
99:e percentilen

Är du med på skillnaden mellan f och f() (eller exempelvis f(x)) nu, @Howardtheory? Om f är en funktion är f() det som f returnerar (om den kallas med noll argument). En funktion är inte samma sak som sin output, precis som att en chokladkaksmaskin inte är samma sak som en chokladkaka.

Tog pinsamt många år för en annan att förstå detta, så vill hjälpa andra att förstå tidigare om jag kan.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Skrivet av Alling:

Är du med på skillnaden mellan f och f() (eller exempelvis f(x)) nu, @Howardtheory? Om f är en funktion är f() det som f returnerar (om den kallas med noll argument). En funktion är inte samma sak som sin output, precis som att en chokladkaksmaskin inte är samma sak som en chokladkaka.

Tog pinsamt många år för en annan att förstå detta, så vill hjälpa andra att förstå tidigare om jag kan.

hm, är inte med helt hundra, du tänkte på att jag givit async function myQuiz () "myQuiz" att det inte finns någit argument inom denna?

men har det något att göra med varför det dyker upp promise och inte min fråga eller?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
99:e percentilen
Skrivet av Howardtheory:

hm, är inte med helt hundra, du tänkte på att jag givit async function myQuiz () "myQuiz" att det inte finns någit argument inom denna?

Mitt inlägg har ingenting att göra med antal argument, utan med skillnaden mellan funktion och output från funktion. Vet inte hur mycket matematik du läst, men om f(x) = x2 säger vi att f är en funktion som ger tillbaka kvadraten av sin input, medan f(x) är samma sak som x2. Alltså, f och f(x) är helt olika saker. f(x) är i detta exempel ingen funktion; det är f som är en funktion.

Precis på samma sätt är det i (funktionella) programmeringsspråk:

function f(x) { return x*x; }

I detta exempel är f en funktion, medan f(5) är vad vi får tillbaka om vi kallar f med 5 som argument. Följande observation (i webbläsarkonsolen) kan göra denna skillnad ännu tydligare:

> typeof f "function" > typeof f(5) "number"

Analogt skulle f kunna vara en maskin som tillverkar chokladkakor, medan f(k) är den chokladkaka vi får från maskinen om vi kör den med kakaosorten k som input.

Det viktiga är skillnaden mellan f (som är en funktion, en "maskin") och till exempel f(5) (som är 25, ett tal). Precis samma skillnad föreligger mellan g och g(), om g är en funktion som kan kallas med noll argument.

Citat:

men har det något att göra med varför det dyker upp promise och inte min fråga eller?

Quiz = require('./network') console.log(Quiz)

Om jag förstår async function rätt är Quiz ovan din async function myQuiz, eftersom det är vad du exporterar från network. Att göra console.log(Quiz) är alltså precis som att göra console.log(f); du loggar själva funktionen istället för det den (eventuellt) returnerar om du kallar på den.

Det är av yttersta vikt att du förstår skillnaden mellan f och f(), i synnerhet i ett funktionellt språk som JavaScript.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

Du verkar använda en hel del saker utan att förstå vad de gör... Promises kan vara lite invecklade, problemet är att en async funktion inte returnerar något värde genast, utan en promise. Det här är bra då man skickar network requests, eftersom programmet annars skulle låsa sig tills det har fått svar.

Med en promise kan du använda .then() för att göra något med värdet då funktionen är färdig. T.ex:

myQuiz().then(t => { // t, som kan heta vad som helst, är det värdet myQuiz returnerar, alltså text console.log(t); });

Permalänk
99:e percentilen
Skrivet av Tazavoo:

Du verkar använda en hel del saker utan att förstå vad de gör... Promises kan vara lite invecklade, problemet är att en async funktion inte returnerar något värde genast, utan en promise. Det här är bra då man skickar network requests, eftersom programmet annars skulle låsa sig tills det har fått svar.

Med en promise kan du använda .then() för att göra något med värdet då funktionen är färdig. T.ex:

myQuiz().then(t => { // t, som kan heta vad som helst, är det värdet myQuiz returnerar, alltså text console.log(t); });

Stämmer bra. Viktigt här att @Howardtheory förstår att det är två distinkt olika saker som potentiellt rör till det hela:

  • Den ena är skillnaden mellan funktion (f) och returvärde (f(), f(x), f(x, y), …).

  • Den andra är skillnaden mellan ”vanliga” (synkrona) funktioner, som returnerar något värde av intresse (eller failar), och async- (asynkrona) diton, som returnerar ett Promise från vilket det någon gång i framtiden förhoppningsvis kommer gå att få ut ett intressant värde.

För övrigt, tack för att du hjälpte mig förstå async och Promise bättre!

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

Hej!

det är så att jag jobbar med quizen och hade gjort fel då man inte skulle skapa sina egna frågor.

Utan man ska alltså hämta dom med RESTful api.

https://jsfiddle.net/fpz2bxe4/1/

där är länken till allt jag gjort och har lite problem med att hämta ut svaren, har skapat en for if sats där jag skapat så att det ska egentligen känna av om det ska vara en input som ska ut annars är det radiobuttons. Men vet inte hur man fixar detta, vad är det för fel jag gjort? Går inte ens att starta quizet nu efter att jag skapat den koden.

Frågan kommer fram, men inget annat svarsalternativ eller input

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem
Skrivet av Howardtheory:

Hej!

det är så att jag jobbar med quizen och hade gjort fel då man inte skulle skapa sina egna frågor.

Utan man ska alltså hämta dom med RESTful api.

https://jsfiddle.net/fpz2bxe4/1/

där är länken till allt jag gjort och har lite problem med att hämta ut svaren, har skapat en for if sats där jag skapat så att det ska egentligen känna av om det ska vara en input som ska ut annars är det radiobuttons. Men vet inte hur man fixar detta, vad är det för fel jag gjort? Går inte ens att starta quizet nu efter att jag skapat den koden.

Frågan kommer fram, men inget annat svarsalternativ eller input

Om du öppnar konsolen i browsern så ser du att det är en massa fel som inträffar.
Exempelvis så definierar du variabler på flera ställen och försöker lägga till saker till objekt som inte existerar.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk

@Leedow:

localhost/:61 Uncaught SyntaxError: Identifier 'alternatives' has already been declared
at Object.<anonymous> (build.js:250)
at __webpack_require__ (build.js:20)
at Object.<anonymous> (build.js:83)
at __webpack_require__ (build.js:20)
at build.js:63
at build.js:66

menar du detta?

får inte till det med alternatives hur det ska känna av om det ska vara en input eller fler alternativ så radiobuttons kommer fram som svarsalternativ. om du förstår hur jag menar?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem
Skrivet av Howardtheory:

@Leedow:

localhost/:61 Uncaught SyntaxError: Identifier 'alternatives' has already been declared
at Object.<anonymous> (build.js:250)
at __webpack_require__ (build.js:20)
at Object.<anonymous> (build.js:83)
at __webpack_require__ (build.js:20)
at build.js:63
at build.js:66

menar du detta?

får inte till det med alternatives hur det ska känna av om det ska vara en input eller fler alternativ så radiobuttons kommer fram som svarsalternativ. om du förstår hur jag menar?

"SyntaxError: Identifier 'alternatives' has already been declared"
Detta betyder att du har definierat variabeln "alternatives" i samma scope på två ställen.
I detta fall, rad 13 och rad 60.

Sen fortsätter du och rättar koden tills du inte har några fel kvar. Efter detta så kan du debugga vidare.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk

@Leedow:

tänkte bara kolla med dig och er här.

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() return jsonQ.question } myQuiz().then((text) => { let qDiv = document.querySelector('#questions') let quest = document.createElement('p') quest.innerHTML = text qDiv.appendChild(quest) })

efter jag har gjort denna kod som skrivit ut frågan, så vad bör man göra i nästa steg? göra så att man kan svara antar jag? och svarar man rätt så kommer man vidare till fråga två. Hur löser man detta på smidigaste sett?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk

Hej!

jag sitter nu på denna kod och försöker få det att fungera.

async function myQuiz () { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() return jsonQ.question } myQuiz().then((text) => { let qDiv = document.querySelector('#questions') let quest = document.createElement('p') quest.innerHTML = text qDiv.appendChild(quest) }) let answerURL = 'http://vhost3.lnu.se:20080/answer/1' let answer = {answer: 0} async function getNextQ (Q) { let question = await myQuiz(myQ) answerURL = question.nextAnswerUrl if(question.alternatives === undefined) { let fAnswer = document.createElement('input') fAnswer.setAttribute('text', 'type', 'id', 'answerForm', 'name', 'answerForm') fo.appendChild(fAnswer) } else { for (let prop in question.alternatives) { let rButton = document.createElement('input') let label = document.createElement('label') rButton.setAttribute('type', 'radio', 'value',`${prop}`) rbutton.setAttribute('id', `${prop}`, 'name', 'radioAnswer') label.setAttribute('for', `${prop}`) label.textContent = `${question.alternatives[prop]}` fo.appendChild(rButton) fo.appendChild(label) } } } async function request (URL) { const response = await window.fetch(URL) const data = await response.json() question = data.question answerURL = nextURL alternatives = data.alternatives } async function response (answerURL) { let answerR = await window.fetch(this.answerURL, { method: 'post', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(answer) }) }

frågan skrivs ut, men vill att svarsalternativen ska komma fram med, antingen en input där man ska skriva in svaret för att komma till nästa eller radiobuttons där det finns fler svarsalternativ.

Tror jag har nästan all kod rätt, men vet inte vad som saknas för att få det att fungera, hade uppskattat all hjälp om ni kan hjälpa mig med detta verkligen.

html koden:

<div class="container"> <h1>Markus Wiland Quiz</h1> </div> </header> <div id="quiz"> <div id="starter"> <i> Skriv in ditt smeknamn för att kunna starta quizen.</i> </div> <form id="formbox"> <input type="text" id="nameInput" placeholder="smeknamn"> <input type="button" id="nameButton" value="starta"> </form> <div id="question-wrapper"> <i>Ditt smeknamn:</i> <div id="displayedName"></div> Du har <b><span id="countdowntimer">20</span></b> kvar på dig att lösa frågan <p id="questions"></p> <p id='alts'></p> <div id="answerForm"></div> <input type="button" id="sumbit" value="Svara"> </div> </div>

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk

async function getQuestion (o) { let question = await myQuiz(myQ) if (question.alternatives === undefined) { let f = document.createElement('input') f.setAttribute('type', 'text', 'id', 'name', 'inputAnswer') form.appendchild(f) } else { for (let alt in question.alternatives) { let rButton = document.createElement('input') let lButton = document.createElement('label') rButton.setAttribute('type', 'radio', 'value', alt) rButton.setAttribute('id', alt, 'name', 'radioAnswer') lButton.setAttribute('for', alt) lButton.textContent = `${question.alternatives[alt]}` form.appendchild(rButton) form.appendchild(lButton) } userAnswer.appendchild() } }

Behöver hjälp med denna kod. Ska göra så att for loopen känner av om det finns 1 eller fler alternativ, och ska då komma fram et textbox om den känner av att det endast finns 1 och finns det fler, ska det komma fram radiobuttons.

Vad är det jag gör för fel. hämtar fråga och svaren med api. ska man bygga ett object? och hur ska det se ut i så fall för att kunna hämta ut detta? Hade uppskattat all hjälp.

async function myQuiz (id) { let myQ = await window.fetch(`http://vhost3.lnu.se:20080/question/1`) let jsonQ = await myQ.json() return jsonQ.question } myQuiz().then((text) => { let qDiv = document.querySelector('#questions') let quest = document.createElement('p') quest.innerHTML = text qDiv.appendChild(quest) })

hämtar frågan här.

Visa signatur

Big Bang Theory
Howard Wolowitz