Javascript: synchronisation avec les bibliothèques convertisseurs asynchrones

1) Quel est le meilleur line- line : https://github.com/Sage/streamlinejs ou narrative: http://www.neilmix.com/narrativejs/ ? D'autres bibliothèques?

2) Comment une de ces bibliothèques fonctionne-t-elle même? (J'ai lu les docs, je cherche une explication simplifiée de ce qui se passe derrière la scène …)

En ce qui concerne la question n ° 2 … en général, ces choses:

  1. Analysez javascript dans un arbre de syntaxe abstraite (AST)
  2. Transformer l'AST
  3. Regroupe l'arbre transformé en javascript

J'ai écrit un convertisseur partiel comme expérience d'apprentissage depuis un certain temps. J'ai utilisé uglify.js pour analyser dans un AST et ensuite le Tree Walker que lib fournit pour effectuer les transformations. Les transformations étaient d'usage général et produisaient un code qui ressemblait à une machine d'état – où chaque étape a commencé avec une séquence de 0 ou plus d'actions de synchronisation et s'est terminée par une action asynchrone. Par exemple, ce script simple:

var fs = require('fs'); console.log(fs.readFile('input.js', _).toString('utf-8')); 

Serait converti à ceci:

 var fs, $v_0; function s_0() { fs = require("fs"); fs.readFile("input.js", function(err, res) { if (err) s_err(err); else { $v_0 = res; s_1(); } }) } function s_1() { console.log($v_0.toString("utf-8")); } s_0() 

J'imagine que la rationalisation et le même comportement font quelque chose de très similaire. Certaines structures (boucles, try / catch) nécessitent une remise spéciale, mais l'approche générale est la même: convertir en une machine d'état.

Les problèmes avec cette approche que j'ai trouvée étaient:

1) ce n'est pas un problème local, c'est-à-dire que tout comportement asynchrone qui doit être manipulé affecte tout le chemin jusqu'à la pile d'appels.

2) vous avez besoin de métadonnées fonctionnelles, de sorte que vous devez faire des hypothèses ou exiger que les gens annotent leurs fonctions de quelque manière que ce soit.