Asynchronous Javascript:sync-to-async转换器libs

Asynchronous Javascript:sync-to-async转换器libs,asynchronous,node.js,javascript,Asynchronous,Node.js,Javascript,1) 什么是更好的streamlinejs: 或叙述:?还有其他的Lib吗 2) 这些图书馆是如何运作的? (我读了文件,我想对幕后发生的事情做一个简单的解释。至于问题2……一般来说: 将javascript解析为某种抽象语法树(AST) 转换AST 将转换后的树重新字符串化为javascript 不久前,我写了一个部分转换器作为学习体验。我使用uglify.js解析为AST,然后使用lib提供的树遍历器进行转换。这些转换是通用的,生成的代码看起来像一个状态机——每个步骤都以0个或多个同步操作序

1) 什么是更好的streamlinejs: 或叙述:?还有其他的Lib吗

2) 这些图书馆是如何运作的? (我读了文件,我想对幕后发生的事情做一个简单的解释。

至于问题2……一般来说:

  • 将javascript解析为某种抽象语法树(AST)
  • 转换AST
  • 将转换后的树重新字符串化为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) 您需要函数元数据,因此您必须做出假设,或者要求人们以某种方式对其函数进行注释。

    我强烈建议使用类似的againts库,因为它为您编写了太多的黑魔法,并限制了您对该语言的使用。最好学习如何编写编写良好的异步代码。然而,我确实推荐作为一个伟大的流控制库(功能强大)。在我的项目中,这是必须的,但我希望尽可能减少它,因此我尝试了解它是如何工作的,并编写类似的东西。只需使用Futures,它为您提供了一个Promise API并异步编写代码。不要抽象出nodejs是异步和非阻塞的事实,否则会导致大的维护问题。不过,请看一下文档,看看它编译成了什么。