Javascript:同步到asynchronous转换器库
1)什么是更好的streamlinejs: https : //github.com/Sage/streamlinejs或叙述: http : //www.neilmix.com/narrativejs/ ? 任何其他库?
2)这些图书馆如何工作? (我阅读文档,我正在寻找一个简单的解释幕后发生的事情..)
至于问题#2 ….一般来说这些事情:
- 将JavaScriptparsing为一些抽象语法树(AST)
- 转换AST
- 将变换的树串化为javascript
我早就写了一个部分转换器作为学习经验。 我用uglify.js来parsing一个AST,然后用lib提供的tree walker来进行转换。 转换是通用目的,并产生看起来像一个状态机的代码 – 每个步骤开始于一系列0或更多同步操作,并以asynchronous操作结束。 例如这个简单的脚本:
var fs = require('fs'); console.log(fs.readFile('input.js', _).toString('utf-8'));
将被转换为:
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()
我想像简化和类似的做一些非常相似的事情。 某些结构(循环,try / catch)需要特殊的处理,但一般的方法是相同的 – 转换成状态机。
我发现这个方法的问题是:
1)这不是一个本地问题 – 即任何需要处理的asynchronous行为都会感染调用堆栈中的所有内容。
2)你需要function元数据,所以你必须作出假设或要求人们以某种方式注释他们的function。