调用方法时获取Perl Dancer2无限循环

时间:2018-05-14 09:39:37

标签: perl infinite-loop dancer

几年前,我与舞者合影留念,效果很好。 现在我尝试将其移至Dancer2。但是,它不再起作用,因为我有一些无限循环。

假设我的应用看起来像这样:

package App;
use Dancer2;

# Photobox is my pm file with all the magic
use Photobox;

my $photobox = photobox->new();

get '/photo' => sub {
    my $photo;

    # Trigger cam and download photo. It returns me the filename of the photo.
    $photo = $photobox->takePicture();

    # Template photo is to show the photo
    template 'photo',
    {
        'photo_filename' => $photo,
        'redirect_uri' => "someURI"
    };        
}

takePicture()看起来像这样:

sub takePicture {

    my $Objekt = shift;
    my $return;
    my $capture;

    $return = `gphoto2 --auto-detect`;

    if ($return =~ m/usb:/) {
            $capture = `gphoto2 --capture-image-and-download --filename=$photoPath$filename`;

        if (!-e $photoPath.$filename) {
            return "no-photo-error.png";
        }
        else {
            return $filename;
        }   
    } else {
      die "Camera not found: $return";
    }
}

当我现在调用/photo时,它将导致无限循环。浏览器一直是“frefreshing”,我的摄像头正在拍摄另一张照片。但它永远不会重定向到/showphoto

当我从bin目录运行perl app.pl应用程序时,它正在使用Dancer(1)。我如何使用Dancer2并使用plackup app.psgi

运行它

我试着将它放入一个前钩子,但它什么都没改变。

更新

我找到了解决此问题的方法。

首先,我稍微重构了我的代码。基本的想法是将拍摄照片和照片操作分成两个不同的路线。这样可以更容易地看到会发生什么。

get '/takesinglephoto' => sub {

    my $photo;


    $photo = takePicture();
    $single_photo=$photo;

    redirect '/showsinglephoto';

;

get '/showsinglephoto' => sub {

    set 'layout' => 'fotobox-main';
    template 'fotobox_fotostrip',
        {
            'foto_filename' => $single_photo,
            'redirect_uri' => "fotostrip",
            'timer' => $timer,
            'number' => 'blank'
        };

};

我将takePicture方法移到了我的Dancer主app.pm。

现在我从日志输出中识别出浏览器没有加载'/ takesinglephoto'页面一次,但是每个secons都会刷新它。我认为原因是,takePicture()需要一些secons来运行并返回输出。舞者不会等到它结束。每次重新加载时,它再次触发takePicture()并导致无限循环。

我通过实施一次简单的检查来解决这个问题,只运行一次takePicture()

# define avariable set to 1 / true
my $do_stuff_once = 1;

get '/takesinglephoto' => sub {

    my $photo;

    # check if variable is true
    if ($do_stuff_once == 1) {
      $photo = takePicture();
      $single_photo=$photo;
      # set variable to false
      $do_stuff_once = 0;
    }

    redirect '/showsinglephoto';

};

get '/showsinglephoto' => sub {

    # set variable back to true
    $do_stuff_once = 1;
    set 'layout' => 'fotobox-main';
    template 'fotobox_fotostrip',
        {
            'foto_filename' => $single_photo,
            'redirect_uri' => "fotostrip",
            'timer' => $timer,
            'number' => 'blank'
        };

};

现在它仍然会刷新/takesinglephoto,但它不会一次又一次地触发takePicture(),最后,当方法返回照片文件名时,它会重定向到/showsinglephoto

我称之为解决方法。有没有更好的方法来解决这个问题?

BR ·阿尔

0 个答案:

没有答案