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