Последовательное выполнение ввода-вывода из будущего - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть простые комбинации из двух операций ввода-вывода с отправкой сообщения боту Telegram

def send:Future[Message] = request(SendMessage(chatID, msg))

Как объединить операции ввода-вывода в greeting, чтобы получить вывод «второй» после «первого» каждыйвремя.Я пытался использовать *>, flatMap, IO.fromFuture, но результат был другим.

first
second

second 
first
  def greeting(chatId: Long): IO[Unit] =
    IO(request(SendMessage(chatId, "first"))) *>
    IO(request(SendMessage(chatId, "second")))

  override def onMessage(message: Message) = message.text match {
    case Some(_) => greeting(message.chat.id)
      .unsafeRunAsyncAndForget()
  }

1 Ответ

1 голос
/ 27 апреля 2019

Следующий фрагмент кода работает, он не запускает второй IO / Future, пока не завершится первый.

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import cats.effect.IO

def send(message: => String): Future[Unit] =
  Future {
    Thread.sleep(2000);
    println(message)
  }

def greeting: IO[Unit] =
  for {
   _ <- IO.fromFuture(IO(send("First")))
   _ <- IO.fromFuture(IO(send("Second")))
  } yield ()

greeting.unsafeRunAsyncAndForget()
...