Du står i kö.
Din kompis bestämmer sig för att springa iväg
och köpa något att äta i kön.
Du behåller platsen i kön.
Kompisen kommer tillbaka med käket och höjer stämningen rejält.
Så funkar asynkront JavaScript
men...
Du vet inte om du kommer att stå kvar på samma plats i kön
Kön kanske plötsligt rör sig snabbt och du är inne
Kompisen kanske chansar ändå och springer iväg
I JavaScript chansar vi inte för då går det garanterat åt helvete
const button = document.getElementById('button');
const globalVariable;
button.addEventListener('click', function(){
globalVariable = "Clicked!";
})
console.log(globalVariable);
Vad skrivs ut i console.log
?
Koden läses typ uppifrån och ner
//Can take forever
for(let i = 0; i < 100000000000000; i++){}
Har du en fet loop kommer den att blockera resterande kod
Vi kan garantera att kod körs som vi vill men vi får långsammare kod.
function foo(){
return "Pffft!"; //remove from stack
}
function bar(){
foo();
}
bar();
call stack
bar();
foo();
//Calls itself
function foo(){
foo(); //Add to stack
}
foo();
call stack
foo();
foo();
foo();
foo();
foo();
foo();
foo();
AJAX & setTimout()
Funktioner eller kodblock som inte blockerar call stack
I princip placeras dessa funktioner i en annan stack som hanteras av event loop
//non blocking
console.log('Starting Sequence!');
setTimeout(function(){
console.log('Hello from timeout!');
}, 250);
console.log('Ending Sequence!');
//non blocking
console.log('Starting Sequence!');
setTimeout(function(){
console.log('Hello from timeout!');
}, 0); //No timeout, 0 milliseconds!
console.log('Ending Sequence!');
foo();
bar();
setTimeout();
setTimeout();
setTimeout();
setTimeout();
Event loopen kollar först om call stack är tom eller inte
setTimeout(function(){
console.log('Hello from timeout!');
}, 0); //No timeout, 0 milliseconds!
Oberoende av tid som sätts så kommer koden att först hanteras av event loop sedan läggas till i call stack
Alltid asynchronous
setTimeout
och setInterval
Alla anrop till databaser via JavaScript sker via AJAX
Asynchronous JavaScript And XML
Subset of ECMAScript Objects
Kommer ifrån JavaScript
Standard sätt att skicka data I JavaScript
{
"name": "Gurt Flurgur",
"weapon": "Rusty knife",
"hp": "10"
"warCry": "function(){
return 'ugh';
}"
}
function()
undefined
DATA SOM DATA: Vi kan skicka med en function men vi ska inte
{
"name": "Gurt Flurgur",
"weapon": "Rusty knife",
"hp": "10",
}
JSON är standarden för att skicka information på webben
I princip ett mer strukturerat och strikt objekt
Processen att ta ett objekt och konvertera den till en sträng
Alla värden som skickas med måste vara i form av en sträng
Datorn ska kunna veta hur den ska konvertera tillbaka till ett objekt
I JavaScript: JSON.stringify()
Även kallat de-serialization
När vi väl ska använda data från JSON
Konvertera tillbaka till ett objekt
I JavaScript: JSON.parse()
Filändelse: .json
JSON strukutureras på detta sätt för att data ska skickas
fetch() allows you to make network requests similar to XMLHttpRequest. The main difference is that the Fetch API uses Promises, which enables a simpler and cleaner API, avoiding callback hell and having to remember the complex API of XMLHttpRequest.Ref: Google Dev: Introduction to fetch()
The Promise object is used for asynchronous computations. A Promise represents a value which may be available now, or in the future, or never.
Wrappar vårt värde i ett Promise object
Ref: MDN - Promisesfetch returnerar ett promise object
fetch('exampleURL.com/doNotUseThis')
.then(function(response) {
return response.json();
})
.then(function(json){
console.log(json);
})
"thenable" om vi ska använda värdet måste vi plocka värdet från objektet och göra om det från JSON till JavaScript
Error handling hanteras med .catch()
fetch('get.com')
.then(function(response) {
return response.json()
})
.then(function(actualData){
console.log(actualData);
})
.catch(function(error) {
console.log(error);
});
Om .then() inte lyckas så går koden vidare till .catch()
Övningar finns på Github/Zenit
07_async.md
Använder sig av samma API som genomgången