我正在尝试定义一些宏,这些宏允许为真正异步的函数声明一系列函数调用。宏将这些调用序列转换为延续;即一个函数,它接受两个参数:函数中要继续的位置和函数的本地状态。
所以,这个想法是:
function test() {
f(1)
f(2)
}
=>
function test(_,local) {
switch (_) {
case 0: f(1,function() { test(1,local) }); return
case 1: f(2,function() { test(2,local) }); return
}
}
为此,我定义了两个宏,function
并且f
. 然而,在一般情况下,将有一个完整的函数列表,除此之外f
可以任意使用并与函数定义中的其他(非宏)代码混合。 这个问题似乎是在问一个更狭窄的问题,我不确定接受的答案(命名模式)是否有效(我不知道如何使它工作),因为需要允许从多种选择中选择任意数量的顺序子宏。
问题是,这需要对嵌套的匿名函数起作用,所以我需要一些方法来在与当前函数相关的 case 语句中分配这些顺序语句编号。我该怎么做呢?
我这里有一个例子。
对于第一种情况,一切正常:每个 case 语句在回调函数中传递下一个 case 语句的编号。但是对于第二种情况,这会失败,例如,第一个 case 语句试图访问嵌套函数中第一个 case 语句的编号。这是因为我们使用全局变量来跟踪案例编号,但我不知道如何相对于当前范围来跟踪这个变量。使用 console.log 我跟踪了评估,发现各个宏没有以嵌套方式评估。如何在一个宏中建立一个值,然后从作为该宏的词法子级的任何宏访问该值?