La tâche est affichée comme terminée, mais le téléchargement est un fichier vide ? Statut d'exécution et de livraison séparés

Le bouton indique « Terminé », mais lorsque je clique sur télécharger, j'obtiens un fichier vide ? Le problème n'est souvent pas le texte d'invite, mais le fait que le backend se souvient uniquement que l'algorithme a été exécuté, et non si la livraison est prête. Ce n'est qu'en séparant l'état d'exécution et l'état de livraison que le front-end peut indiquer à l'utilisateur les progrès réels. Cet article explique clairement l’idée partagée.

La page des tâches affiche « Terminé », mais lorsque je clique sur Télécharger, j'obtiens un fichier vide. Le problème n'est souvent pas le texte d'invite lui-même, mais le fait que le backend enregistre uniquement la fin de l'exécution de l'algorithme et n'enregistre pas si la livraison est prête. Cet article est destiné aux développeurs qui effectuent du traitement de documents, des tâches asynchrones ou l'intégration de traductions. Après lecture, vous saurez comment séparer l'état d'exécution et l'état de livraison afin que le front-end puisse montrer la progression réelle à l'utilisateur.

Les exemples de cet article utilisent des échantillons synthétiques et le code a été vérifié par échantillons dans un environnement isolé. Cela ne représente pas une garantie de tous les fichiers réels ou effets du produit. Avant de traiter des documents importants, veuillez conserver les originaux et les examiner en fonction des limites et des éléments d'acceptation du texte.

Le téléchargement est un fichier vide, mais la tâche est affichée comme terminée ? Conclusion en une phrase

Divisez d'abord le « traitement terminé » en trois états : traitement, produit et acceptation, puis laissez le frontal afficher uniquement l'état confirmé.

votre situationPratiques recommandéesraison
La tâche est terminée, mais le fichier n'a pas encore été généréEntrez dans l'état « Produit prêt » et il peut être téléchargé sans l'afficher à l'avance.La fin du traitement signifie uniquement que le calcul s'est arrêté, mais ne signifie pas qu'il existe des fichiers localisables.
Le fichier a été généré, mais le contenu n'a pas encore été vérifiéContinuez à "Vérifier les résultats" et attendez l'acceptationLa préparation du produit ne signifie pas le respect du contrat de livraison
La tâche a échouéAfficher le stade et la raison de l'échec, et donner les actions correspondantesL'échec doit également comporter des étapes et ne peut pas être masqué par une icône rotative
Le téléchargement renvoie HTTP 200Continuez à vérifier le type, la taille, la disponibilité de l'analyse et le contenu attendu200 peut correspondre à une page de connexion, une erreur JSON ou un document vierge

Faites au moins la différence entre le traitement, le produit et l'acceptation

La fin du traitement signifie que le calcul est arrêté ; le produit est prêt, ce qui signifie que le fichier peut être localisé ; et la réception est terminée, ce qui signifie que le dossier est conforme au contrat de livraison. Les trois ne se produisent pas nécessairement en même temps.

L'échec doit également comporter des étapes et ne peut pas être masqué par une icône en rotation permanente. L'utilisateur sait si une erreur s'est produite lors du traitement, de la génération ou de la vérification, et sait donc s'il doit attendre, réessayer ou réparer l'entrée.

📊 Comparaison de base

ÉtatQuestions réponduesPeut-on promettre aux utilisateurs des téléchargements ?
Fin du traitementSi le calcul s'est arrêténe peut pas
Produit prêtY a-t-il un fichier qui peut être localiséNon, je dois encore vérifier
Acceptation terminéeLe document est-il conforme au contrat de livraison ?Peut

Nier explicitement le succès du saut

from enum import Enum

class State(Enum):
    PROCESSING = "processing"
    ARTIFACT_READY = "artifact_ready"
    VERIFIED = "verified"
    FAILED = "failed"

def transition(state, event):
    allowed = {
        (State.PROCESSING, "stored"): State.ARTIFACT_READY,
        (State.PROCESSING, "error"): State.FAILED,
        (State.ARTIFACT_READY, "checks_passed"): State.VERIFIED,
        (State.ARTIFACT_READY, "error"): State.FAILED,
    }
    if (state, event) not in allowed:
        raise ValueError("invalid state transition")
    return allowed[(state, event)]

s = transition(State.PROCESSING, "stored")
assert s is State.ARTIFACT_READY
assert transition(s, "checks_passed") is State.VERIFIED
assert transition(s, "error") is State.FAILED
try:
    transition(State.PROCESSING, "checks_passed")
except ValueError:
    pass
else:
    raise AssertionError("cannot skip artifact readiness")

Cette machine à états synthétique n'inclut pas l'annulation, la révision et la suppression de la file d'attente à l'expiration. Les mises en œuvre en production doivent évoluer en fonction de l'entreprise, plutôt que de regrouper tous les événements dans un binaire « succès/échec ».

Les messages asynchrones peuvent également être répétés ou dans le désordre, nécessitant la coopération des numéros de version, des transactions et un traitement idempotent. Sinon, les anciens messages risquent d'écraser le nouveau statut et la même tâche risque d'être écrite à plusieurs reprises.

Les invites frontales doivent correspondre aux faits

Chaque état sur le front-end doit correspondre à un fait qui peut être confirmé par le back-end et donner les actions disponibles correspondantes.

ÉtatLes utilisateurs peuvent voirActions disponibles
processingTraitementVérifier la progression ou annuler
artifact_readyVérification des résultatsDisponible sans engagement préalable
verifiedFichier téléchargeableTéléchargez et consultez les instructions d'acceptation
failedÉtapes et causes de défaillanceCorrigez ou réessayez en fonction de la raison

Même si le téléchargement réussit, cela ne signifie pas que le contenu est correct.

HTTP 200 peut renvoyer une page de connexion, un mauvais JSON ou un document vierge. L'acceptation doit au moins vérifier les éléments suivants :

  • Type : indique si le format de fichier est celui attendu
  • Taille : Si le fichier est vide ou manifestement anormal
  • Disponibilité de l'analyse : indique si le fichier peut être ouvert et analysé normalement
  • Contenu attendu : si le contenu est cohérent avec les exigences de la tâche

Pour la traduction, l'intégrité linguistique et la révision terminologique sont des contrôles de niveau supérieur et ne doivent pas être remplacés par « le fichier peut être ouvert ».

Gardez le statut transparent lors de l'intégration des fonctionnalités de traduction

Après avoir accédé à OmniDoc (portail produit), vos propres produits doivent toujours conserver leur propre statut de stockage et de livraison. Une fois la tâche de la plate-forme terminée, elle peut d'abord être mappée sur « Commencer à recevoir les résultats », puis le succès sera affiché après avoir confirmé que le fichier est disponible. Cela correspond davantage à l'expérience réelle de l'utilisateur que de transmettre directement un état.

Références : Python enum

🎯 Quelle méthode vous convient ?

si tu……

Si votre tâche n'est qu'un calcul en arrière-plan et qu'il n'y a pas de fichier de livraison externe

Seules la fin du traitement et les étapes de défaillance doivent être enregistrées, et le produit et l'acceptation peuvent être temporairement omis.

Si vous devez permettre aux utilisateurs de télécharger les résultats

Vous devez attendre que le produit soit prêt et ait été accepté avant qu'il soit affiché comme disponible au téléchargement.

Si vous avez accès à une plateforme de traitement tierce

Mappez l'achèvement de la plateforme sur « Commencer à recevoir les résultats », puis affichez le succès après avoir confirmé le fichier.

Si les tâches peuvent être répétées ou renvoyées dans le désordre

Ajoutez un numéro de version à l'état et assurez-vous que l'état avance uniquement grâce aux transactions et au traitement idempotent.

❓ Questions fréquemment posées (FAQ)

1. La tâche est affichée comme terminée, pourquoi ne peut-elle pas encore être téléchargée ?

Étant donné que la fin du traitement signifie uniquement que le calcul s'est arrêté, il faut également confirmer que le produit est prêt et a passé l'acceptation, ce qui signifie que le dossier est conforme à l'accord de livraison.

2. Le téléchargement renvoie HTTP 200. Cela signifie-t-il qu'il n'y a aucun problème avec le fichier ?

incertain. HTTP 200 peut renvoyer une page de connexion, un mauvais JSON ou un document vierge, nécessitant également des vérifications du type, de la taille, de la disponibilité de l'analyse et du contenu attendu.

3. Pourquoi l'état de défaillance comporte-t-il des étapes ?

La phase d'échec indique à l'utilisateur si le problème concerne le traitement, la génération ou la vérification, afin qu'il puisse décider d'attendre, de réessayer ou de corriger l'entrée.

4. Est-il suffisant que le fichier puisse être ouvert pour des tâches de traduction ?

pas assez. Les contrôles d'intégrité linguistique et de terminologie sont des contrôles de niveau supérieur et ne doivent pas être remplacés par « le fichier peut être ouvert ».

📝Résumé

Ce n'est qu'en séparant l'état d'exécution et l'état de livraison que le front-end peut indiquer à l'utilisateur les progrès réels. Ce n'est que lorsque le produit est prêt et réussit l'acceptation qu'il doit être affiché comme disponible au téléchargement.

Essayez-le maintenant : téléchargez le document pour lancer la traduction, en conservant la mise en page d'origine.

Mis à jour le 2026-11-14