> ## 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.

# Streaming y trabajos asincrónicos

> Cargue el progreso con useConvertFile y manejo de 202 (auto-async) en React Native.

# Streaming y trabajos asincrónicos

`@markpdf/react-native` no expone `convertStream`: la transmisión de fragmentos (`ReadableStream`) tiene un soporte inconsistente entre el motor RN JS (Hermes/JSC) y las versiones de RN. Para mostrar el progreso al usuario, utilice el progreso de **carga** de `useConvertFile` y, para documentos grandes, considere [`pages`](/docs/public/es/api/parameters#pages) para solicitar rangos más pequeños en lugar de transmisión de respuesta.

## Subir progreso con `useConvertFile`

```tsx theme={null}
import { useConvertFile } from "@markpdf/react-native";

function UploadScreen({ client, file }: { client: MarkpdfClient; file: LocalFile }) {
  const { convert, status, progress, markdown, error } = useConvertFile(client);

  return (
    <View>
      <Button title="Convertir" onPress={() => convert(file, { mode: "fast" })} />
      {status === "uploading" && <Text>Subiendo: {progress}%</Text>}
      {status === "converting" && <Text>Procesando…</Text>}
      {error && <Text>Error: {error.message}</Text>}
      {markdown && <Text>{markdown}</Text>}
    </View>
  );
}
```

`useConvertFile` usa `XMLHttpRequest` (disponible como global en React Native) en lugar de `fetch`, porque `fetch` no expone eventos de progreso de carga en ningún tiempo de ejecución de JS.

## Empleos por saturación (202)

`convertLocalFile` y `convertFromUrl` manejan `202` automáticamente con `autoPoll: true` (predeterminado):

```ts theme={null}
const markdown = await client.convertLocalFile({ uri, name });
// If the server responded 202, SDK already polled /jobs/{id} internally
```

### Manual de encuestas

```ts theme={null}
const result = await client.convertLocalFile({ uri, name }, { autoPoll: false });

if (typeof result === "object" && "job_id" in result) {
  const job = await client.waitForJob(result.job_id, { pollIntervalMs: 3000, timeoutMs: 120_000 });
  if (job.status === "completed") {
    console.log(job.body);
  }
}
```

<Tip>
  En una aplicación móvil con conexión intermitente, considere un `timeoutMs` explícito en `waitForJob` para no dejar la interfaz de usuario esperando indefinidamente si el usuario pierde la señal.
</Tip>

<Warning>
  Si la aplicación pasa a segundo plano durante la encuesta (el usuario sale de la aplicación), es posible que el temporizador `waitForJob` se detenga según el sistema operativo. Al regresar al primer plano, si `jobId` todavía está vigente (dentro de aproximadamente 1 hora), puede reanudar la encuesta llamando a `getJob(jobId)` nuevamente.
</Warning>
