[−][src]Function riker_es::ask
pub fn ask<Msg, Ctx, R, T>(ctx: &Ctx, receiver: &T, msg: Msg) -> RemoteHandle<R> where
Ctx: TmpActorRefFactory + Run,
Msg: Message,
R: Message,
T: Tell<Msg>,
Convenience fuction to send and receive a message from an actor
This function sends a message msg
to the provided actor receiver
and returns a Future
which will be completed when receiver
replies
by sending a message to the sender
. The sender is a temporary actor
that fulfills the Future
upon receiving the reply.
futures::future::RemoteHandle
is the future returned and the task
is executed on the provided executor ctx
.
This pattern is especially useful for interacting with actors from outside of the actor system, such as sending data from HTTP request to an actor and returning a future to the HTTP response, or using await.
Examples
#[derive(Default)] struct Reply; impl Actor for Reply { type Msg = String; fn recv(&mut self, ctx: &Context<Self::Msg>, msg: Self::Msg, sender: Sender) { // reply to the temporary ask actor sender.as_ref().unwrap().try_tell( format!("Hello {}", msg), None ).unwrap(); } } // set up the actor system let sys = ActorSystem::new().unwrap(); // create instance of Reply actor let actor = sys.actor_of::<Reply>("reply").unwrap(); // ask the actor let msg = "Will Riker".to_string(); let r: RemoteHandle<String> = ask(&sys, &actor, msg); assert_eq!(block_on(r), "Hello Will Riker".to_string());