Hämta data över HTTP med fetch
Använda Promises och Async/Await istället för Callbacks för asynkron hantering.
Historia: Webb 2.0 och Rich Internet Applications och kom på 2000-talet
let ajax = new XMLHttpRequest();
ajax.open('get', url);
ajax.onreadystatechange = function() {
if(ajax.status == 200 && ajax.readyState == 4) {
console.log('Result: ' + ajax.responseText);
}
}
ajax.send();Till vår räddning 🤩
Kan ff användas i mindre omfattning...
Tänk att du är ett barn och du vill ha ett riktigt coolt lego. Du vet inte om du kommer få det eller när.
Din mamma kan antingen
Köpa det riktigt coola legot till dig då hon är glad 💁♀️
eller
inte köpa det riktigt coola legot då hon inte är glad 🧟♀️
let momIsHappy = false;
function tryPromise(momIsHappy) {
return new Promise(function(resolve, reject) {
if(momIsHappy) {
resolve('Lego köpt!');
} else {
reject('No lego for you!');
}
});
}
tryPromise(momIsHappy).then(function(data) {
console.log(data);
}).catch(function(err) {
console.log(err);
});Alla Promises har then() som är det som blir resolved och catch() för det som är rejected
fetch(url) // Funktionen fetch körs direkt
.then(function(response) {
// Den här koden körs när servern svarar
// ett promise, gör om svaret till ett objekt
return response.json();
})
.then(function(data) {
// Returen från förra skickas in som objekt
// Skriver ut vår data
console.log(data);
}).catch(function(error) {
// Denna kod körs om det blir fel exempelvis
// att servern inte svarar
console.error(error);
});
// Koden här kommer att köras direkt efter fetch
// och innan servern hinner svaraNu är legot ett spännande svar från ett API!
async function getData() {
let response = await fetch(url);
// Väntar på svar från server och
// lägger datat i json-format
let data = await response.json();
// Väntar på att json-datat görs
// om till ett objekt
console.log(data); // Skriver ut vårt data
}
getData();Async/Await-metoden har ingen annan funktionalitet än Promises med .then(), ger bara "renare" kod!
Vi kommer använda denna metod!
async function getData() {
try { //Om promise inte blir "resolved" => gå till catch
let response = await fetch(url);
// Väntar på svar från server och
// lägger datat i json-format
let data = await response.json();
// Väntar på att json-datat görs
// om till ett objekt
console.log(data); // Skriver ut vårt data
} catch(err) { // promise "rejected"
console.log(err);
}
}
getData();try/catch tillhör normal felhantering i JS. Här fångas en "rejected" Promise upp i catch
hantera resolved + reject med async funktion
async function getData() {
try { // Om ej lyckas, d.v.s ingen
// promise resolved => gå till catch
let response = await fetch(url);
// Väntar på svar från server och
// lägger datat i json-format
let data = await response.json();
// Väntar på att json-datat görs
// om till ett objekt
console.log(data); // Skriver ut vårt data
} catch(err) { // promise rejected
console.log(err);
}
return data;
}
async otherFunc(){
let data = await getData();
console.log(data);
}Det som returneras från en async funktion är också ett promise och måste hanteras som det!
returnera från en async funktion
async function getData() {
try {
let response = await fetch(url);
let data = await response.json();t
console.log(data);
} catch(err) {
console.log(err);
}
}
console.log(1);
console.log(2);
getData();
console.log(3);
console.log(4);
Detta kan uppstå som problem när du försöker hämta data från API
En lösning: Använda en proxy-server. Ex denna https://corsproxy.github.io/
Obs! I dessa videos används ES 6 Arrow functions