2011-06-08 37 views

回答

6

是的,reset s可以嵌套,是的,它可以是有用的。舉例來說,我最近爲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)。

請注意嵌套的async如何更改控制流。沒有它,線路field2 = "waiting"將不會執行,直到成功完成第二個RPC。

當RPC被創建時,實現捕獲到最內層的async邊界的延續,並且在成功完成RPC時掛起它以供執行。因此,嵌套的async塊允許一旦第二個RPC被創建,控制就立即流入線路。另一方面,如果沒有嵌套塊,延續會一直延伸到外部塊的末端,在這種情況下,外部async內的所有代碼都會在每個RPC上阻塞。

1

reset形成一個抽象,使得外部代碼不受內部代碼使用延續魔法實現的事實的影響。因此,如果您正在使用重置和移位編寫代碼,則可以調用其他代碼,這些代碼可能也可能不會在重置和移位時執行。從這個意義上說,它們可以嵌套。