On Github Swiip / talk-async-js
const oAuthResponse = syncRequest(oAuthOptions()); const token = JSON.parse(oAuthResponse.body).access_token; const searchResponse = syncRequest(searchOptions(token)); const search = JSON.parse(searchResponse.body); search.statuses.forEach(status => console.log(status.text));- C'est un extrait de code, le code intégral est sur Github - Il s'agit d'une recherche sur l'API Twitter - Il faut gérer l'authentification avant la requête elle même - Le = ici n'est pas anodin mais n'est possible qu'en synchrone
callbackRequest(oAuthOptions(), (error, response, body) => {
const token = JSON.parse(body).access_token;
callbackRequest(searchOptions(token), (error, response, body) => {
const search = JSON.parse(body);
search.statuses.forEach(status => console.log(status.text));
});
});
- Plus valeurs de retour
- Rupture dans le sens du lecture du code
- A la ligne du bas du code, on a pas la valeur de retour
- On voit apparaitre une indentation qui sera rapidement difficile à maîtriser
- Cela s'appelle le Callback Hell
promiseRequest(oAuthOptions()).then(response => {
const token = JSON.parse(response).access_token;
return promiseRequest(searchOptions(token));
}).then(response => {
const search = JSON.parse(response);
search.statuses.forEach(status => console.log(status.text));
});
- C'est grâce au chaînage que le code se simplifie
- Plutôt que d'imbrique on retourne la seconde promesse
- Cela permet de rester au même niveau d'indentation
function *foo() {
yield 1;
yield 2;
yield 3;
}
var it = foo();
console.log( it.next() ); // { value:1, done:false }
console.log( it.next() ); // { value:2, done:false }
console.log( it.next() ); // { value:3, done:false }
console.log( it.next() ); // { value: undefined, done: true }
- ES6 propose la syntaxe function * avec les yield qu'on appele generator
- Contrairement à beaucoup de nouveauté d'ES6, ce n'est pas du sucre syntaxique
- C'est une fonction qui ne s'executera pas entierement, elle bloquera sur les yield
- Le next qu'on voit en bas permet de relancer l'execution
import co from 'co';
co(function *() {
const oAuthResponse = yield promiseRequest(oAuthOptions());
const token = JSON.parse(oAuthResponse).access_token;
const searchResponse = yield promiseRequest(searchOptions(token));
const search = JSON.parse(searchResponse);
search.statuses.forEach(status => console.log(status.text));
});
- On revient à une syntaxe qui totalement linéaire
- Attention, c'est toujours asynchrone, ça n'implique pas de changement en terme de perf
- Les promesses sont au coeur du mécanisme, ce n'est pas un concept à oublier
async function start() {
const oAuthResponse = await promiseRequest(oAuthOptions());
const token = JSON.parse(oAuthResponse).access_token;
const searchResponse = await promiseRequest(searchOptions(token));
const search = JSON.parse(searchResponse);
search.statuses.forEach(status => console.log(status.text));
}
start();
- On revient à une syntaxe qui totalement linéaire
- Attention, c'est toujours asynchrone, ça n'implique pas de changement en terme de perf
- Les promesses sont au coeur du mécanisme, ce n'est pas un concept à oublier