2013-05-06 20 views
13

Tôi có đoạn mã sau bên trong một diễn viênAkka: Gởi nhắn tin trong tương lai để một diễn viên

def receive = { 
    case All() => { 
     val collection: BSONCollection = db("ping") 
     val future:Future[List[Ping]] = collection.find(BSONDocument()).cursor[Ping].toList() 
     val zender = sender 
     future onComplete { 
      case Success(list) => zender ! list 
      case Failure(throwable) => zender ! List() 
     } 
    } 
} 

tôi không thích làm thế nào tôi có sử dụng chức năng onComplete để gửi kết quả trở lại nam diễn viên người gửi. Tôi muốn biết nếu có thể chuyển đổi nó thành một cái gì đó như thế này:

def receive = { 
    case All() => { 
     val collection: BSONCollection = db("ping") 
     val future:Future[List[Ping]] = collection.find(BSONDocument()).cursor[Ping].toList() 
     "sender ! future" // one option 
     "future.map(list => sender ! list)" //Another option. I know it's not map, but maybe another function   
    } 
} 

Tôi cảm thấy điều này chảy tốt hơn với chuỗi tương lai.

+0

không phải là phương pháp tiếp cận đầu tiên của bạn? –

+0

@ Alex Vâng, nhưng đường ống thì thanh lịch hơn nhiều. – Luciano

+0

Được rồi. Nhưng bạn đang nói ** Tôi không thích cách tôi phải sử dụng hàm onComplete để gửi kết quả lại cho diễn viên người gửi. ** và mã của bạn thực hiện chính xác điều đó - bạn đang gửi kết quả trả về cho diễn viên người gửi . –

Trả lời

29

Bạn có thể sử dụng mẫu ống cho điều đó. Chỉ cần import akka.pattern.pipe và sau đó bạn sẽ có thể gửi thư từ tương lai đến các diễn viên với future pipeTo actor.

+1

Vâng, đó là những gì tôi đang tìm kiếm, cảm ơn! – Luciano

11

Nếu bạn muốn có một danh sách trống khi xảy ra lỗi, có thể bạn muốn có các cuộc gọi chuỗi "khôi phục" và "pipeTo".

Các vấn đề liên quan