Size: a a a

2020 November 23

d

diabolo in Rust Async
Alexander Zaitsev
use actix::prelude::*;

/// Define message
#[derive(Message)]
#[rtype(result = "Result<bool, std::io::Error>")]
struct Ping;

// Define actor
struct MyActor;

// Provide Actor implementation for our actor
impl Actor for MyActor {
   type Context = Context<Self>;

   fn started(&mut self, ctx: &mut Context<Self>) {
      println!("Actor is alive");
   }

   fn stopped(&mut self, ctx: &mut Context<Self>) {
      println!("Actor is stopped");
   }
}

/// Define handler for `Ping` message
impl Handler<Ping> for MyActor {
   type Result = Result<bool, std::io::Error>;

   fn handle(&mut self, msg: Ping, ctx: &mut Context<Self>) -> Self::Result {
       println!("Ping received");
       nats::asynk::connect("url").await;
       Ok(true)
   }
}

#[actix_rt::main]
async fn main() {
   // Start MyActor in current thread
   let addr = MyActor.start();

   // Send Ping message.
   // send() message returns Future object, that resolves to message result
   let result = addr.send(Ping).await;

   match result {
       Ok(res) => println!("Got result: {}", res.unwrap()),
       Err(err) => println!("Got error: {}", err),
   }
}
repo, а не выплевки в чат, пожалуйста
источник

AZ

Alexander Zaitsev in Rust Async
diabolo
это повод для меня переписать rt
так ты ответить можешь: возможно ли awaitнуть в текущем actix в хендлере или нет?
источник

d

diabolo in Rust Async
Alexander Zaitsev
так ты ответить можешь: возможно ли awaitнуть в текущем actix в хендлере или нет?
да, но это Делается через комбинаторы
источник

AZ

Alexander Zaitsev in Rust Async
если возможно, то каким образом это можно\принято делать?
источник

AZ

Alexander Zaitsev in Rust Async
diabolo
да, но это Делается через комбинаторы
о, уже лучше. есть где-то пример, как это делается?
источник

d

diabolo in Rust Async
Alexander Zaitsev
о, уже лучше. есть где-то пример, как это делается?
документация по футурам тебе поможет, там есть всё
источник

AZ

Alexander Zaitsev in Rust Async
понял, спасибо (нет)
источник

d

diabolo in Rust Async
Alexander Zaitsev
понял, спасибо (нет)
что там не понятно?
источник

AZ

Alexander Zaitsev in Rust Async
я хз даже, про какое именно место в доке ты ведёшь речь
источник

d

diabolo in Rust Async
ищи места and, then
источник

AZ

Alexander Zaitsev in Rust Async
сейчас я делаю делаю await в sync функции через (как же там его) tokio::bla-bla-bla::block_on. вот это нормас работает. хочется получше
источник

KR

Kai Ren in Rust Async
Alexander Zaitsev
сейчас я делаю делаю await в sync функции через (как же там его) tokio::bla-bla-bla::block_on. вот это нормас работает. хочется получше
>_<
источник

KR

Kai Ren in Rust Async
источник

d

diabolo in Rust Async
Alexander Zaitsev
сейчас я делаю делаю await в sync функции через (как же там его) tokio::bla-bla-bla::block_on. вот это нормас работает. хочется получше
то есть ты тупо делаешь блок, то есть никакого асинка
источник

d

diabolo in Rust Async
100 баллов
источник

AZ

Alexander Zaitsev in Rust Async
diabolo
то есть ты тупо делаешь блок, то есть никакого асинка
офк. поэтому я и спрашиваю, как правильно
источник

KR

Kai Ren in Rust Async
Alexander Zaitsev
офк. поэтому я и спрашиваю, как правильно
Твоя async-функция - это футура. Берёшь эту футуру, заворчаиваешь в ActorFuture. И этот ActorFuture делаешь результатом хэндлера. Я же писал сегодня тебе.
источник

d

diabolo in Rust Async
Alexander Zaitsev
офк. поэтому я и спрашиваю, как правильно
скажи мне плиз, что происходит, когда ты делаешь. await?
источник

KR

Kai Ren in Rust Async
Комбинаторы писать не обязательно. Можно async move { } и внутри `.await`ы себе юзать
источник

ph

pl 🦑 hk in Rust Async
impl Handler<Ping> for MyActor {
   type Result = ResponseActFuture<Self, Result<bool, std::io::Error>>;

   fn handle(&mut self, msg: Ping, ctx: &mut Context<Self>) -> Self::Result {
       println!("Ping received");
       let f = actix::fut::wrap_future::<_, Self>(async move {
           connect("url").await;
           Ok(true)
       });
       Box::pin(f)
   }
}
источник