1

每当有人更改数据库中的某个字段时,我的页面中有一个区域会发出一个事件。现在,该事件似乎触发了一段时间,但是经过一段时间的空闲时间后,当列更改时,我不再收到广播消息。

我有 Firebug,但我不完全确定如何确保连接仍然打开。如果我查看 Firebug,它会说:“CLOSED:2,CONNECTING:0,OPEN:1,readyState:0”,但无论事件是否正在触发(发射,显示),它似乎都这么说。我需要这个 SSE 是持久的,我认为这可以通过禁用 Mojolicious 中的超时来实现,但似乎并非如此。

我的问题如下: A) 我如何判断连接是否仍处于活动状态?和 B)只要用户正在查看页面,我如何保持连接持久?

相关的 Mojolicious 代码在这里:

package Ownership;
use Mojo::Base 'Mojo::EventEmitter';

sub newowner {
    my $self = shift;
    my ( $owner, $location ) = @_;

    my $timestamp = localtime(time);

    $self->emit( newowner => "[$timestamp] - 
        $owner has taken ownership of $location" );
}

package main;

my $ownership = Ownership->new;
get '/events' => sub {
    my $self = shift;

    Mojo::IOLoop->stream( $self->tx->connection )->timeout(0);

    $self->res->headers->content_type('text/event-stream');

    my $cb = $ownership->on(
        newowner => sub {
            my ( $ownership, $message ) = @_;
            $self->write("event:newowner\ndata: $message\n\n");
        }
     );

     $self->on(
        finish => sub {
            my $self = shift;
            $ownership->unsubscribe( newowner => $cb );
        }
     );
};

这是我的 index.html.ep 中的 Javascript:

var events = new EventSource('<%= url_for 'events' %>');
events.addEventListener('newowner', function(event) {
    div.innerHTML = div.innerHTML + event.data + '<br />';
}, false);
4

0 回答 0