Mic*_*ael 9 continuations scala reset
这是关于Scala延续的问题.可以resets
嵌套吗?如果他们可以:什么是嵌套resets
有用的?有没有嵌套的例子resets
?
是的,reset
s可以嵌套,是的,它可以是有用的.作为一个例子,我最近为scalagwt项目构建了一个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
Run Code Online (Sandbox Code Playgroud)
评论表明执行的顺序.这里,该async
方法执行一个reset
,并且每个服务调用执行一个shift
(您可以在我的github fork上看到实现,特别是Async.scala).
请注意嵌套如何async
更改控件流.没有它,field2 = "waiting"
直到成功完成第二个RPC之后才会执行该行.
在创建RPC时,实现会将延续捕获到最内层async
边界,并在成功完成RPC后暂停执行.因此,嵌套async
块允许控件在第二次RPC生成后立即流到其后的行.另一方面,如果没有嵌套块,则continuation将一直延伸到外部async
块的末尾,在这种情况下,外部的所有代码async
都会阻塞每个RPC.