W aplikacji Mojolicious, próbuję przekonwertować pliki ODT do formatu HTML, gdy kliknięciu łącza. Konwertuję pliki za pomocą "soffice", polecenia powłoki. Konwersja plików zajmuje trochę czasu. Wysyłam komunikaty o stanie do użytkownika, aby powiadomić go o postępie. Wysyłam te komunikaty o aktualizacji statusu, pisząc do obiektu Mojo :: Log. Następnie subskrybuję ten obiekt dziennika na trasie EventSource.Korzystanie AnyEvent run_cmd w Mojolicious, wciąż otrzymuję ten błąd: „AnyEvent :: CondVar: rekurencyjny blokowanie czekać próbę”
Potem pętla poprzez pliki i korzystać AnyEvent :: Util run_cmd wykonać zewnętrznego programu „soffice”.
for my $file (@{ $filelist }) {
my $output_dir = './output_dir';
my $cmd = "soffice --headless --convert-to html --outdir '$output_dir' '$file'";
my $cv = AnyEvent->condvar;
my $w;
$w = run_cmd($cmd,
'>' => sub { my $out = shift;
&WriteToLog({ status => "cmd output '$out'..." });
undef $w;
$cv->send;
},
'2>' => sub { my $err = shift;
&WriteToLog({ status => "ERROR '$err'..." });
undef $w;
$cv->send;
}
);
$cv->recv;
}
Prawie skopiowane i wklejone z głównych samouczków AnyEvent. Jeśli istnieje tylko kilka plików do konwersji (około 2 lub 3), wtedy wszystko pójdzie dobrze. Komunikaty o stanie wysyłane za pośrednictwem połączenia EventSource są wyświetlane w przeglądarce klienta. Następnie po wszystkie pliki zostały przeliczone, strona internetowa jest renderowane.
Jeśli ma zostać przetworzonych więcej plików, kilka plików zostanie przekonwertowanych, pojawi się komunikat o błędzie w tytule wątku.
Routing dla trasy zawierającą kod powyżej to:
my $initdocs = $r->under->to('docroute#initdocs');
$initdocs->get('/showdocs')->to('docroute#showdocs');
Kod powyżej w „initdocs” trasy.
Każda pomoc jest doceniana. Z góry dziękuję.
Po prostu fyi, w przyszłości dodanie tagu [tag: perl] pomoże większej liczbie osób zobaczyć twoje mojolicious pytania. –