Lingara Lingara Documentación Guías API Bibliotecas Apps Crear Aplicación web
Idioma: Español

Flujos

Esta página está traducida del inglés. Si ambas difieren, la página en inglés es la correcta. Leer la página en inglés

Cuatro operaciones emiten sus resultados como eventos enviados por el servidor: generar vocabulario, enviar un mensaje al tutor, crear un plan de lección y seguir uno. Cada biblioteca convierte el flujo de eventos en el tipo de iterador propio del lenguaje y te entrega cada evento ya decodificado en un valor tipado.

Cómo termina un flujo

  • Cuando el trabajo ha terminado. La iteración se detiene sola en el evento final del flujo. En un plan de lección, ese evento final lleva el resultado, así que lo recibes antes de que termine el bucle.
  • Cuando la API informa de un error. Un error que llega dentro del flujo se lanza como error de API, del mismo tipo que uno que llegue antes.
  • Cuando falla la conexión. Un flujo que termina antes de su evento final, o que no envía absolutamente nada durante 120 segundos, se lanza como error de transporte.
  • Cuando te detienes. Cancela la llamada de la forma habitual en tu lenguaje, o deja de leer, y la conexión se cierra enseguida.

Los comentarios de keepalive y los tipos de evento que una biblioteca aún no conoce se omiten, así que una API más nueva nunca rompe una biblioteca más antigua.

Nunca se repite

Un flujo que ha entregado aunque sea un evento nunca lo reintenta la biblioteca, porque repetirlo podría gastar tu cupo dos veces. Si el flujo de un plan de lección se corta después de haber empezado, sigue el mismo plan con streamLessonPlan y el plan_id de su primer evento.

Lenguaje del ejemplo de código

TypeScript

const stream = client.generateVocabulary({ level: 2, source_lang: "en", target_lang: "zh", count: 8 });
for await (const ev of stream) {
  if (ev.event === "item") console.log(ev.data.word, ev.data.translation);
}

Rust

use lingara::models::{GenerateVocabularyEvent, VocabRequest};
use std::num::NonZeroU8;

let request = VocabRequest { level: 2, source_lang: "en".into(), target_lang: "zh".into(), count: NonZeroU8::new(8) };
let mut stream = client.generate_vocabulary(&request).await?;
while let Some(event) = stream.next().await {
    if let GenerateVocabularyEvent::Item(item) = event? {
        println!("{} {}", item.word, item.translation);
    }
}

Go

count := uint8(8)
s, err := client.GenerateVocabulary(ctx, lingara.VocabRequest{Level: 2, SourceLang: "en", TargetLang: "zh", Count: &count})
if err != nil {
	return err
}
defer s.Close()
for ev, err := range s.Events() {
	if err != nil {
		return err
	}
	if item, ok := ev.(lingara.GenerateVocabularyEventItem); ok {
		fmt.Println(item.Data.Word, item.Data.Translation)
	}
}

Java

import com.getlingara.client.model.GenerateVocabularyEvent;
import com.getlingara.client.model.VocabRequest;

VocabRequest request = new VocabRequest().level(2).sourceLang("en").targetLang("zh").count(8);
try (EventStream<GenerateVocabularyEvent> stream = client.generateVocabulary(request)) {
  for (GenerateVocabularyEvent event : stream) {
    if (event instanceof GenerateVocabularyEvent.Item item) {
      System.out.println(item.data().getWord() + " " + item.data().getTranslation());
    }
  }
}

Kotlin

import com.getlingara.kotlin.LingaraClient
import com.getlingara.kotlin.model.GenerateVocabularyEvent
import com.getlingara.kotlin.model.VocabRequest

val request = VocabRequest(level = 2, sourceLang = "en", targetLang = "zh", count = 8)
// The request is sent here; collect the stream once, inside use {}.
client.generateVocabulary(request).use { stream ->
    stream.collect { event ->
        when (event) {
            is GenerateVocabularyEvent.Item -> println("${event.data.word} ${event.data.translation}")
            is GenerateVocabularyEvent.Started -> Unit
        }
    }
}

Ruby

client.generate_vocabulary(level: 2, source_lang: "en", target_lang: "zh", count: 8) do |event|
  case event
  in Lingara::GenerateVocabularyEventItem => item then puts "#{item.data.word}: #{item.data.translation}"
  else nil
  end
end

PHP

use Lingara\Model\VocabRequest;
use Lingara\Stream\GenerateVocabularyEvent;

$request = new VocabRequest(['level' => 2, 'source_lang' => 'en', 'target_lang' => 'zh', 'count' => 8]);
foreach ($client->generateVocabulary($request) as $event) {
    if ($event instanceof GenerateVocabularyEvent\Item) {
        echo $event->data->getWord(), ': ', $event->data->getTranslation(), "\n";
    }
}

Qué envuelve esta página