【问题标题】:Javascript: sync to async converter libsJavascript:同步到异步转换器库
【发布时间】:2011-09-07 17:10:57
【问题描述】:

1) 有什么更好的streamlinejs:https://github.com/Sage/streamlinejs 或叙述:http://www.neilmix.com/narrativejs/?还有其他库吗?

2) 这些库中的任何一个是如何工作的? (我阅读了文档,我正在寻找对幕后发生的事情的简单解释..)

【问题讨论】:

  • 我强烈推荐像这样的 againts 库,因为它为您编写了太多的黑魔法,并且限制了您可以使用该语言做什么。最好学习如何编写编写良好的异步代码。不过,我确实推荐 Futures 作为流控制的优秀库(而且功能强大)。
  • 在我的项目中这是必须的,但我想尽可能减少它,因此我试图了解它是如何工作的并自己编写类似的东西..
  • 只需使用为您提供 Promise API 的 Futures 并异步编写代码。不要抽象 nodejs 是异步和非阻塞的事实,否则您可能会导致 big 维护问题。看看stormjs 文档,看看它编译成什么。

标签: asynchronous node.js javascript


【解决方案1】:

至于问题 #2....一般来说这些事情:

  1. 将 javascript 解析为一些抽象语法树 (AST)
  2. 转换 AST
  3. 将转换后的树字符串化回 javascript

不久前我写了一个部分转换器作为学习经验。我使用 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) 您需要函数元数据,因此您要么必须做出假设,要么要求人们以某种​​方式注释他们的函数。

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 2017-12-09
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多