Frage
Ich schreibe ein PHP-Programm. Seine Funktion besteht darin, im Hintergrund ein Berechnungsprogramm aufzurufen, nachdem Parameter vom Frontend empfangen wurden, und ein Bild basierend auf diesen Parametern zu generieren (dieser Vorgang dauert eine bestimmte Zeit, etwa 2 Sekunden). mehr).
Schließlich muss ich auf der Benutzeroberfläche warten, bis das Bild generiert wurde, und es dann in einem Div anzeigen.
Das Problem ist also: Während der Bildgenerierung ist die Schnittstelle nicht reaktionsfähig.
Außerdem habe ich keine Möglichkeit, das zu wissen, wenn das Programm nicht ausgeführt werden kann
Lösungen zum Ausprobieren
Die Lösung, die ich jetzt verwende, besteht darin, mit setInterval einmal pro Sekunde abzufragen, ob das Bild generiert wurde. Wenn ja, übergeben Sie die URL des Bildes an das Ziel-IMG-Tag im Frontend. Wenn die URL nicht innerhalb von 10 Sekunden abgerufen wird, gilt die Generierung als fehlgeschlagen.
Aber ich finde, dass diese Methode sehr dumm ist, und wenn sie fehlschlägt, wird es lange dauern, bis man es weiß.
Ich möchte also fragen: Haben Sie gute Vorschläge oder gute Implementierungsmethoden, um die Benutzererfahrung dieses Verarbeitungsprozesses zu verbessern?
Antwortinhalt:
Frage
Ich schreibe ein PHP-Programm. Seine Funktion besteht darin, im Hintergrund ein Berechnungsprogramm aufzurufen, nachdem Parameter vom Frontend empfangen wurden, und ein Bild basierend auf diesen Parametern zu generieren (dieser Vorgang dauert eine bestimmte Zeit, etwa 2 Sekunden). mehr).
Schließlich muss ich auf der Benutzeroberfläche warten, bis das Bild generiert wurde, und es dann in einem Div anzeigen.
Das Problem ist also: Während der Bildgenerierung reagiert die Schnittstelle nicht.
Außerdem habe ich keine Möglichkeit, das zu wissen, wenn das Programm nicht ausgeführt werden kann
Lösungen zum Ausprobieren
Die Lösung, die ich jetzt verwende, besteht darin, mit setInterval einmal pro Sekunde abzufragen, ob das Bild generiert wurde. Wenn ja, übergeben Sie die URL des Bildes an das Ziel-IMG-Tag im Frontend. Wenn die URL nicht innerhalb von 10 Sekunden abgerufen wird, gilt die Generierung als fehlgeschlagen.
Aber ich finde, dass diese Methode sehr dumm ist, und wenn sie fehlschlägt, wird es lange dauern, bis man es weiß.
Ich möchte also fragen: Haben Sie gute Vorschläge oder gute Implementierungsmethoden, um die Benutzererfahrung dieses Verarbeitungsprozesses zu verbessern?
Sie können eine Ladeoberfläche erstellen, um es einfacher zu machen, indem Sie einfach ein rotierendes GIF finden, um das Div zu füllen,
Um abzufragen, ob das Bild generiert wurde, können Sie Websocket verwenden,
Ein weiterer Vorschlag besteht darin, dass Sie in dem Programm, das das Bild generiert, feststellen, ob das Bild erfolgreich generiert werden kann. Wenn nicht, generieren Sie ein Bild, das einen Fehler darstellt. Dadurch kann sichergestellt werden, dass das Bild an das Frontend übertragen wird. -
Der Schlüssel hier ist, dass es am besten ist, nicht die Logik zu verwenden: „Wenn es innerhalb von 10 Sekunden keine Rückmeldung gibt, muss es fehlgeschlagen sein.“ Wenn jedoch der Hintergrund ausfällt, wird der Codeblock zur Fehlerbehandlung sofort aufgerufen und eine Nachricht zurückgegeben, um den Benutzer über den Fehler zu informieren. Ich verstehe nicht ganz, wie es in PHP gehandhabt wird, in Python:
<code>try: #尝试执行下面代码,若失败,执行except里的代码
# 这里写创建图片的逻辑,image = ...
return success(message='Done.',data=image) #返回成功消息和图片
except Exception as ex: #若发生错误
logger(ex) #记录错误文档
return fail(message='Error.') #马上返回失败消息,而不是等10秒</code>
Nach dem Login kopieren
Ajax kann gelöst werden, Erfolgs- und Fehlerrückrufe werden verarbeitet und die neue Version verfügt auch über eine Timeout-Verarbeitung