【发布时间】:2011-09-07 17:10:57
【问题描述】:
1) 有什么更好的streamlinejs:https://github.com/Sage/streamlinejs 或叙述:http://www.neilmix.com/narrativejs/?还有其他库吗?
2) 这些库中的任何一个是如何工作的? (我阅读了文档,我正在寻找对幕后发生的事情的简单解释..)
【问题讨论】:
标签: asynchronous node.js javascript
1) 有什么更好的streamlinejs:https://github.com/Sage/streamlinejs 或叙述:http://www.neilmix.com/narrativejs/?还有其他库吗?
2) 这些库中的任何一个是如何工作的? (我阅读了文档,我正在寻找对幕后发生的事情的简单解释..)
【问题讨论】:
标签: asynchronous node.js javascript
至于问题 #2....一般来说这些事情:
不久前我写了一个部分转换器作为学习经验。我使用 uglify.js 解析为 AST,然后使用 lib 提供的树遍历器进行转换。这些转换是通用的,并且生成的代码看起来像一个状态机——每个步骤都以一系列 0 或多个同步操作开始,并以异步操作结束。例如。这个简单的脚本:
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) 这不是本地问题 - 即任何需要处理的异步行为都会感染调用堆栈中的所有内容。
2) 您需要函数元数据,因此您要么必须做出假设,要么要求人们以某种方式注释他们的函数。
【讨论】: