Trait actix::fut::future::ActorFuture

source ·
pub trait ActorFuture<A: Actor> {
    type Output;

    // Required method
    fn poll(
        self: Pin<&mut Self>,
        srv: &mut A,
        ctx: &mut A::Context,
        task: &mut Context<'_>
    ) -> Poll<Self::Output>;
}
Expand description

Trait for types which are a placeholder of a value that may become available at some later point in time.

ActorFuture is very similar to a regular Future, only with subsequent combinator closures accepting the actor and its context, in addition to the result.

ActorFuture allows for use cases where future processing requires access to the actor or its context.

Here is an example of a handler on a single actor, deferring work to another actor, and then updating the initiating actor’s state:

use actix::prelude::*;

// The response type returned by the actor future
type OriginalActorResponse = ();
// The error type returned by the actor future
type MessageError = ();
// This is the needed result for the DeferredWork message
// It's a result that combine both Response and Error from the future response.
type DeferredWorkResult = Result<OriginalActorResponse, MessageError>;

impl Handler<DeferredWork> for OriginalActor {
    // Notice the `Response` is an `ActorFuture`-ized version of `Self::Message::Result`.
    type Result = ResponseActFuture<Self, DeferredWorkResult>;

    fn handle(&mut self, _msg: DeferredWork, _ctx: &mut Context<Self>) -> Self::Result {
        // this creates a `Future` representing the `.send` and subsequent
        // `Result` from `other_actor`
        let update_self = self.other_actor
            .send(OtherMessage {})
            // Wrap that future so chained handlers can access the actor
            // (`self` in the synchronous code) as well as the context.
            .into_actor(self)
            // once the wrapped future resolves, update this actor's state
            .map(|result, actor, _ctx| {
                match result {
                    Ok(v) => {
                        // update actor (self) state
                        actor.inner_state.update_from(v);
                        Ok(())
                    },
                    // Failed to send message to other_actor
                    Err(_e) => Err(()),
                }
            });

        // box and return the wrapped future
        Box::pin(update_self)
    }
}

See also WrapFuture::into_actor() which provides future conversion.

Required Associated Types§

source

type Output

The type of value produced on completion.

Required Methods§

source

fn poll( self: Pin<&mut Self>, srv: &mut A, ctx: &mut A::Context, task: &mut Context<'_> ) -> Poll<Self::Output>

Implementations on Foreign Types§

source§

impl<A, B, Act> ActorFuture<Act> for Either<A, B>
where A: ActorFuture<Act>, B: ActorFuture<Act, Output = A::Output>, Act: Actor,

§

type Output = <A as ActorFuture<Act>>::Output

source§

fn poll( self: Pin<&mut Self>, act: &mut Act, ctx: &mut Act::Context, task: &mut Context<'_> ) -> Poll<A::Output>

source§

impl<F, A> ActorFuture<A> for Box<F>
where F: ActorFuture<A> + Unpin + ?Sized, A: Actor,

§

type Output = <F as ActorFuture<A>>::Output

source§

fn poll( self: Pin<&mut Self>, srv: &mut A, ctx: &mut A::Context, task: &mut Context<'_> ) -> Poll<Self::Output>

source§

impl<P, A> ActorFuture<A> for Pin<P>
where P: Unpin + DerefMut, <P as Deref>::Target: ActorFuture<A>, A: Actor,

§

type Output = <<P as Deref>::Target as ActorFuture<A>>::Output

source§

fn poll( self: Pin<&mut Self>, srv: &mut A, ctx: &mut A::Context, task: &mut Context<'_> ) -> Poll<Self::Output>

Implementors§

source§

impl<A> ActorFuture<A> for TimerFunc<A>
where A: Actor,

§

type Output = ()

source§

impl<A, B, F, Act> ActorFuture<Act> for AndThen<A, B, F>
where A: ActorTryFuture<Act>, B: ActorTryFuture<Act, Error = A::Error>, F: FnOnce(A::Ok, &mut Act, &mut Act::Context) -> B, Act: Actor,

§

type Output = Result<<B as ActorTryFuture<Act>>::Ok, <A as ActorTryFuture<Act>>::Error>

source§

impl<A, B, F, Act> ActorFuture<Act> for Then<A, B, F>
where A: ActorFuture<Act>, B: ActorFuture<Act>, F: FnOnce(A::Output, &mut Act, &mut Act::Context) -> B, Act: Actor,

§

type Output = <B as ActorFuture<Act>>::Output

source§

impl<F, A> ActorFuture<A> for FutureWrap<F, A>
where F: Future, A: Actor,

§

type Output = <F as Future>::Output

source§

impl<F, A> ActorFuture<A> for Timeout<F>
where F: ActorFuture<A>, A: Actor,

§

type Output = Result<<F as ActorFuture<A>>::Output, ()>

source§

impl<S, A> ActorFuture<A> for Finish<S>
where S: ActorStream<A>, A: Actor,

§

type Output = ()

source§

impl<S, A, C> ActorFuture<A> for Collect<S, C>
where S: ActorStream<A>, A: Actor, C: Default + Extend<S::Item>,

§

type Output = C

source§

impl<S, A, F, Fut> ActorFuture<A> for Fold<S, F, Fut, Fut::Output>
where S: ActorStream<A>, A: Actor, F: FnMut(Fut::Output, S::Item, &mut A, &mut A::Context) -> Fut, Fut: ActorFuture<A>,

§

type Output = <Fut as ActorFuture<A>>::Output

source§

impl<T, A> ActorFuture<A> for Ready<T>
where A: Actor,

§

type Output = T

source§

impl<U, Fut, A, F> ActorFuture<A> for MapErr<Fut, F>
where Fut: ActorTryFuture<A>, A: Actor, F: FnOnce(Fut::Error, &mut A, &mut A::Context) -> U,

§

type Output = Result<<Fut as ActorTryFuture<A>>::Ok, U>

source§

impl<U, Fut, A, F> ActorFuture<A> for MapOk<Fut, F>
where Fut: ActorTryFuture<A>, A: Actor, F: FnOnce(Fut::Ok, &mut A, &mut A::Context) -> U,

§

type Output = Result<U, <Fut as ActorTryFuture<A>>::Error>

source§

impl<U, Fut, A, F> ActorFuture<A> for Map<Fut, F>
where Fut: ActorFuture<A>, A: Actor, F: FnOnce(Fut::Output, &mut A, &mut A::Context) -> U,

§

type Output = U