> ## Documentation Index
> Fetch the complete documentation index at: https://docs.markpdf.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# Trabajos asincrónicos

> Maneje 202 (auto-asíncrono) con el paquete Flutter/Dart.

# Trabajos asincrónicos

Cuando todos los backends de conversión están saturados, API responde `202` con `job_id` y pone en cola la solicitud en lugar de fallar o bloquear la solicitud. Consulte [`GET /jobs/{id}`](/docs/public/es/api/jobs).

<Note>
  El paquete `markpdf` no expone fragmentos de transmisión (`/convert/stream`); está diseñado para el flujo típico de una aplicación móvil, donde se espera el resultado completo. Si necesita una transmisión progresiva desde su propio backend, hágalo allí con Node.js [SDK](/docs/public/es/sdks/nodejs/streaming-and-async) o [Python](/docs/public/es/sdks/python/streaming-and-async) y exponga el resultado final a su aplicación Flutter.
</Note>

## Manejo automático (`autoPoll: true`)

De forma predeterminada, `ConvertOptions.autoPoll` es `true` y todos los métodos de conversión (`convertFile`, `convertBytes`, `convertFromUrl`) sondean de forma transparente hasta que se obtiene el resultado:

```dart theme={null}
final result = await client.convertFile(file); // espera y hace poll automáticamente
```

## Manual de encuestas

Con `autoPoll: false`, el método devuelve `QueuedResult` en lugar de esperar:

```dart theme={null}
final result = await client.convertFile(
  file,
  options: const ConvertOptions(autoPoll: false),
);

switch (result) {
  case QueuedResult(:final job):
    print('En cola: ${job.jobId}');
    final finalJob = await client.waitForJob(
      job.jobId,
      pollInterval: const Duration(seconds: 5),
    );

    if (finalJob.status == JobStatus.completed) {
      final markdown = finalJob.body as String;
    } else {
      throw Exception(finalJob.error);
    }
  case MarkdownResult(:final markdown):
    print(markdown);
  case JsonConvertResult():
    break;
}
```

### Encuesta con `Stream` (para mostrar el progreso en la interfaz de usuario)

Un patrón común en las aplicaciones Flutter es exponer el estado del trabajo como `Stream<Job>` para actualizar un `StreamBuilder`:

```dart theme={null}
Stream<Job> watchJob(MarkpdfClient client, String jobId) async* {
  Job job;
  do {
    job = await client.getJob(jobId);
    yield job;
    if (job.status == JobStatus.queued || job.status == JobStatus.processing) {
      await Future.delayed(const Duration(seconds: 5));
    }
  } while (job.status == JobStatus.queued || job.status == JobStatus.processing);
}
```

```dart theme={null}
StreamBuilder<Job>(
  stream: watchJob(client, jobId),
  builder: (context, snapshot) {
    final status = snapshot.data?.status;
    return switch (status) {
      JobStatus.queued => const Text('En cola...'),
      JobStatus.processing => const Text('Procesando...'),
      JobStatus.completed => const Text('Listo'),
      JobStatus.failed => const Text('Failed'),
      _ => const CircularProgressIndicator(),
    };
  },
);
```

<Tip>
  En condiciones de carga normales, no verá `202`; solo sucede cuando todos los backends están saturados. `autoPoll: true` (el valor predeterminado) ya lo cubre sin código adicional en la mayoría de los casos.
</Tip>

<Warning>
  Los resultados de los trabajos completados caducan en aproximadamente 1 hora. Si guarda un `jobId` y recibe `404` al consultarlo, reenvíe la conversión original.
</Warning>
