Đây là câu hỏi về sự tiếp tục của Scala. Có thể resets
lồng nhau không? Nếu họ có thể: những gì được lồng nhau resets
hữu ích cho? Có ví dụ nào về lồng nhau resets
không?Ví dụ về đặt lại lồng nhau trong Scala
Trả lời
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.
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.