Mojo :: Ioloop计时器的问题



i我的莫约利奇控制器中有一个子,当CSV文件通过HTTP帖子上传时,该子被称为。在上传文件后,会呈现一条消息,说"您将在x秒内重定向"。因此,我想实现Mojo :: ioloop :: delay,并且作为回调,我使用重定向语句。但是我收到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');

预先感谢您

redirect_to实际上是render,它呈现HTTP 302对重定向的响应。您不能渲染两次,因此,即使您在redirect_to呼叫之前将交易保留下来,它也已经渲染了页面。因此,您要做的事情有两个实际选择;使用JavaScript渲染页面,该页面将在超时后执行重定向,或渲染带有元刷新标签的HTML页面,这将导致该页面在延迟后重定向。此MDN页面讨论了这两种方法。

uploadMojo::IOLoop->timer之后返回,没有等待计时器。您可以尝试使用Mojo :: ioloop->延迟和$delay->wait。但是我不确定它是如何工作的。因此,这可能等效于sleep

您真的需要从Perl代码重定向吗?您可以使用setTimeout渲染一些JS以达到相同的效果。

实际上,我建议将所有文本和重定向转移到JS,并仅渲染JSON,其中包含upload中的一些状态信息。因此,您可以通过错误处理实现更好的UI。

相关内容

  • 没有找到相关文章