这是关于Scala延续的问题。 resets
可以嵌套吗?如果他们可以:嵌套resets
对什么有用?是否有嵌套resets
?
答案 0 :(得分:6)
是的,reset
可以嵌套,是的,它可能很有用。作为一个例子,我最近为scalagwt project原型化了一个API,它允许GWT开发人员以直接样式编写异步RPC(远程过程调用)(与GWT for Java中使用的回调传递样式相反) )。例如:
field1 = "starting up..." // 1
field2 = "starting up..." // 2
async { // (reset)
val x = service.someAsyncMethod() // 3 (shift)
field1 = x // 5
async { // (reset)
val y = service.anotherAsyncMethod() // 6 (shift)
field2 = y // 8
}
field2 = "waiting..." // 7
}
field1 = "waiting..." // 4
评论表明执行顺序。在这里,async
方法执行reset
,每个服务调用执行shift
(您可以在my github fork上看到实施,特别是Async.scala)。< / p>
注意嵌套async
如何更改控制流。没有它,行field2 = "waiting"
将在成功完成第二个RPC之后才会执行。
当创建RPC时,实现会捕获到最内层async
边界的延续,并在成功完成RPC后暂停它以便执行。因此,嵌套的async
块允许控件在第二次RPC生成后立即流到其后的行。另一方面,如果没有嵌套块,延续将一直延伸到外部async
块的末尾,在这种情况下,外部async
内的所有代码都会阻塞每个RPC。
答案 1 :(得分:1)
reset
形成一个抽象,以便外部代码不受内部代码用continuation魔术实现的事实的影响。因此,如果您使用复位和移位编写代码,它可以调用其他代码,这些代码可能也可能不会通过复位和移位实现。从这个意义上讲,它们可以嵌套。