重定向之前Mojo :: IOLoop计时器的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重定向之前Mojo :: IOLoop计时器的问题相关的知识,希望对你有一定的参考价值。
我的Mojolicious控制器中有一个sub,当通过http帖子上传csv文件时调用该子控件。上传文件后,将显示一条消息,说明“您将在x秒内重定向”。所以我想实现Mojo :: IOLoop :: Delay和作为回调我使用redirect语句。但我得到Morbo的以下错误:
Mojo::Reactor::EV: Timer failed: Transaction already destroyed at /usr/local/share/perl/5.22.1/Mojolicious/Plugin/DefaultHelpers.pm line 168.
控制器代码:
sub upload {
my $self = shift;
# Check file size
return $self->render(text => 'File is too big.', status => 200)
if $self->req->is_limit_exceeded;
# Process uploaded file
return $self->redirect_to('/') unless my $newCsv = $self->param('fileToUpload');
my $size = $newCsv->size;
my $name = $newCsv->filename;
my $delay = 2;
$self->render(text => "Thanks for uploading $size byte file $name.<br>
You will be redirected in $delay seconds");
Mojo::IOLoop->timer($delay => sub {
$self->redirect_to('/');
});
}
相关路线:
$r->get('/')->to(controller => 'main', action => 'index');
$r->post('/uploadCsv')->to(controller => 'main', action => 'upload')->name('uploadCsv');
先感谢您
upload
在Mojo::IOLoop->timer
之后返回,没有等待计时器。您可以尝试使用Mojo::IOLoop->delay和$delay->wait
。但我不确定它是如何工作的。所以它可能只相当于sleep
。
你真的需要从perl代码重定向吗?您可以使用setTimeout
渲染一些js以获得相同的效果。
事实上,我建议移动所有文本并重定向到js,并在upload
中仅使用json渲染一些状态信息。因此,您可以通过错误处理实现更好的UI。
redirect_to
实际上是一个render
,它呈现HTTP 302响应重定向。你不能渲染两次,所以即使你在redirect_to
调用之前保持事务处理,它也会渲染页面。因此,您尝试做的事情有两种实际选择;使用javascript呈现页面,该页面将在超时后执行重定向,或呈现带有元刷新标记的html页面,这将导致页面在延迟后重定向。这个MDN page讨论了这两种方法。
以上是关于重定向之前Mojo :: IOLoop计时器的问题的主要内容,如果未能解决你的问题,请参考以下文章
Bootstrap Modal 和 Jquery Address ajax 重定向计时问题