2011-06-03 74 views
2

1)什么是更好的streamlinejs:https://github.com/Sage/streamlinejs 或叙述:http://www.neilmix.com/narrativejs/?任何其他库?Javascript:同步到异步转换库

2)这些图书馆如何工作? (我阅读文档,我找了这是怎么回事幕后的简化说明。)

+1

我强烈推荐_againts_这样的图书馆,因为它为你写了太多的黑魔法,限制了你对该语言的使用。最好学习如何编写写得很好的异步代码。不过,我推荐[期货](https://github.com/coolaj86/futures)作为流量控制的强大库。 – Raynos 2011-06-03 10:11:48

+2

在我的项目中这是必须的,但我想尽量减少它,因此我试图了解它是如何工作和写类似的我自己.. – ciochPep 2011-06-03 10:17:43

+0

只需使用Futures,它给你一个Promise API和异步编写代码。不要提取nodejs是异步和非阻塞的事实,否则会导致_big_维护问题。看看[stormjs](https://github.com/guileen/stormjs)文档,看看它编译的是什么。 – Raynos 2011-06-03 10:19:24

回答

2

至于问题#2 ....一般来说,这些东西:

  1. 解析javascript改成一些抽象语法树(AST)
  2. 改造AST
  3. 字符串化的转化树回的javascript

我写了一个部分转换器作为一个学习的工作经验一会儿回来。我使用uglify.js来解析AST,然后解析lib提供的树walker来完成转换。这些转换是通用目的,并生成了看起来像状态机的代码 - 每个步骤都以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)您需要功能元数据,因此您必须做出假设或要求人们以某种​​方式注释其功能。