Lingara Lingara Documentation Guides API Bibliothèques Applications Créer Application web
Langue: Français

Flux

Cette page est traduite de l'anglais. En cas de différence, la page anglaise fait foi. Lire la page en anglais

Quatre opérations diffusent leurs résultats sous forme d’événements envoyés par le serveur : générer du vocabulaire, envoyer un message au tuteur, créer un plan de cours et en suivre un. Chaque bibliothèque transforme le flux d’événements en l’itérateur propre au langage et vous remet chaque événement déjà décodé en une valeur typée.

Comment un flux se termine

  • Quand le travail est fini. L’itération s’arrête d’elle-même au dernier événement du flux. Pour un plan de cours, ce dernier événement porte le résultat : vous le recevez donc avant la fin de la boucle.
  • Quand l’API signale une erreur. Une erreur qui arrive à l’intérieur du flux est levée comme erreur d’API, du même type qu’une erreur arrivée avant lui.
  • Quand la connexion échoue. Un flux qui se termine avant son dernier événement, ou qui n’envoie absolument rien pendant 120 secondes, est levé comme erreur de transport.
  • Quand vous arrêtez. Annulez l’appel de la manière habituelle dans votre langage, ou arrêtez de lire, et la connexion se ferme rapidement.

Les commentaires de maintien de connexion et les types d’événements qu’une bibliothèque ne connaît pas encore sont ignorés : une API plus récente ne casse donc jamais une bibliothèque plus ancienne.

Jamais rejoué

Un flux qui a livré ne serait-ce qu’un événement n’est jamais retenté par la bibliothèque, car le répéter pourrait consommer votre quota deux fois. Si le flux d’un plan de cours s’interrompt après avoir commencé, suivez le même plan avec streamLessonPlan et le plan_id de son premier événement.

Langage de l'exemple de code

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";
    }
}

Ce que cette page encapsule