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. 但是,我不知道如何实现gotos. 任何帮助表示赞赏。

4

2 回答 2

2

正如其他人所说,请查看 Promises。本教程确实帮助我开始使用它们,希望它也可以帮助你。https://spring.io/understanding/javascript-promises

于 2014-12-28T04:34:46.347 回答
1

用于yield制作可以暂停的函数,然后重新生成器以在旧浏览器中运行它:

首先,我们将dosomething(4)您的语言转换为:

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

注意 node err-back 约定 - 回调有两个参数 - 第一个是错误,第二个是返回值。

然后 - 您可以轻松地将它们转换为承诺:

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

现在,当他们返回承诺时——你可以用yields 换行:

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

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

于 2014-12-28T11:53:29.887 回答