2014-12-28 43 views
2

我正在为要在浏览器中运行的元语言编写解析器。元语言是阻塞的,但由于JavaScript的限制,需要在解释器中转换为非阻塞。以编程方式将同步代码转换为异步代码

例如,元语言代码可能看起来像

1. dosomething(4) 
2. dosomethingelse(1) 
3. dosomething(7) 
4. goto 2 

用JavaScript实现的功能

function dosomething(n, callback) { 
    ... // do something with n 
    setTimeout(callback, 1000); 
} 

function dosomethingelse(n, callback) { 
    ... // do something else with n 
    setTimeout(callback, 1000); 
} 

没有goto报表,这将是很容易编译成JavaScript,然后eval。但是,我不知道如何实施goto。任何帮助表示赞赏。

+0

无条件转到只是一个while循环 – akonsu

+0

你如何解释一个非阻塞语言中的阻塞while循环? – twinlakes

+0

我不明白这个问题。 – akonsu

回答

1

使用yield让你可以暂停功能,然后regenerator在旧的浏览器中运行它:

首先,我们把dosomething(4)在你的语言为:

function doSomething(n, callback){ 
    setTimeout(function(){ callback(null,true); }, n); 
} 

注意节点ERR-回约定 - 回调函数有两个参数 - 第一个是错误,第二个是返回值。

那么 - 你可以将它们转换为承诺容易:

var doSomething = Promise.promisify(doSomething); // using bluebird. 

现在,当他们返回promises-你可以换行与yield S:

Promise.coroutine(function*(){ 
    yield dosomething(4); 
    yield dosomethingelse(1); 
    yield dosomething(7); 
}); 

您将需要调用addYieldHandler在为了处理产生的非诺言价值。这将在开始下一步之前“同步”执行,以等待每个承诺解决。最后使用再生器将代码转换为ES5浏览器可以运行的东西(因为yield只能在FF和Chrome中的atm标志下运行)。