2011-06-08 28 views

Trả lời

6

Có, reset s có thể được lồng nhau và, vâng, nó có thể hữu ích. Ví dụ, gần đây tôi đã tạo mẫu API cho scalagwt project cho phép các nhà phát triển GWT viết RPC không đồng bộ (gọi thủ tục từ xa) theo kiểu trực tiếp (trái ngược với kiểu chuyển tiếp cuộc gọi được sử dụng trong GWT cho Java). Ví dụ:

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 

Nhận xét cho biết thứ tự thực hiện. Ở đây, phương thức async thực hiện reset và mỗi cuộc gọi dịch vụ thực hiện shift (bạn có thể xem triển khai trên my github fork, cụ thể là Async.scala).

Lưu ý cách lồng nhau async thay đổi luồng điều khiển. Nếu không có nó, dòng field2 = "waiting" sẽ không được thực hiện cho đến khi sau khi hoàn tất thành công RPC thứ hai.

Khi RPC được thực hiện, việc triển khai sẽ thực hiện việc tiếp tục tối đa ranh giới async bên trong nhất và tạm ngưng nó để thực hiện sau khi hoàn thành RPC thành công. Do đó, khối lồng nhau async cho phép kiểm soát dòng chảy ngay lập tức đến dòng sau khi nó được thực hiện ngay khi RPC thứ hai được thực hiện. Nếu không có khối lồng nhau, mặt khác, việc tiếp tục sẽ mở rộng tất cả các cách để kết thúc khối bên ngoài async, trong trường hợp đó tất cả các mã bên ngoài async sẽ chặn trên mỗi RPC.

1

reset tạo thành một trừu tượng để mã bên ngoài không bị ảnh hưởng bởi thực tế là mã bên trong được thực hiện bằng phép thuật tiếp tục. Vì vậy, nếu bạn đang viết mã với thiết lập lại và thay đổi, nó có thể gọi mã khác mà có thể hoặc có thể không được thực hiện với thiết lập lại và thay đổi là tốt. Theo nghĩa này chúng có thể được lồng vào nhau.