Come gestire la concorrenza in JS
Frontend developer @ RedTurtle
Studente @ UniFe
@nicolazambello
nzambello
nzambello @ italiajs.slack.com
0. Event loop
1. Callbacks
2. Promise
3. Generatori
4. async / await
Come funziona JavaScript:
console.log('Hi');
setTimeout(function cb1() {
console.log('cb1');
}, 5000);
console.log('Bye');
Una callback è una funzione passata ad un’altra funzione come parametro, all’interno della quale essa verrà chiamata.
$('#btn1').click(function() {
alert('Btn 1 Clicked');
});
var friends = ['Mike', 'Stacy', 'Andy', 'Rick'];
friends.forEach(function(eachName, index) {
console.log(index + 1 + '. '.concat(eachName));
});
// 1. Mike, 2. Stacy, 3. Andy, 4. Rick
getData(function (a) {
getMoreData(a, function (b) {
getMoreData(b, function (c) {
getMoreData(c, function (d) {
getMoreData(d, function (e) {
console.log('Callback Hell');
});
});
});
});
});
Le promises sono definite come “una delega (proxy) per un valore che - in qualche momento - diventerà disponibile”.
ES 6
Le promises possono essere in 3 stati:
asyncFunc1()
.then(asyncFunc2)
.then(asyncFunc3)
.catch(err => {
// ERROR!
})
fetch(apiURL).then(
res => {
// handle response
},
err => {
// handle error
}
)
Demo time!
I generatori sono funzioni dalle quali è possibile uscire e poi rientrarvi in un secondo momento.
ES 6
Due importanti applicazioni dei generatori sono:
const genFunc = function* () { ··· };
let genObj = genFunc();
let obj = {
* generatorMethod() {
···
}
};
let genObj = obj.generatorMethod();
class MyClass {
* generatorMethod() {
···
}
}
let myInst = new MyClass();
let genObj = myInst.generatorMethod();
I generatori possono essere utilizzati principalmente in 3 modi:
Demo time!
Quando viene chiamata una funzione async, viene restituita una Promise.
Quando la funzione async restituisce un valore, la Promise verrà risolta con il valore restituito.
Quando la funzione async genera un'eccezione o un valore, la Promise verrà rifiutata con il valore generato.
ES 7
Una funzione async può contenere un'espressione await, che sospende l'esecuzione della funzione async e attende la risoluzione della Promise, quindi riprende l'esecuzione della funzione async e restituisce il valore risolto.
Demo time!
Occhio al async nella callback di map()
async function getAllFiles (fileNames) {
return await* fileNames.map(async function(fileName) {
var file = await getFileAsync(fileName);
return parse(file);
});
}