Scala中嵌套重置的示例

Mic*_*ael 9 continuations scala reset

这是关于Scala延续的问题.可以resets嵌套吗?如果他们可以:什么是嵌套resets有用的?有没有嵌套的例子resets

Aar*_*rup 6

是的,resets可以嵌套,是的,它可以是有用的.作为一个例子,我最近为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.