Ошибка «излучать без подачи или реагировать» при нажатии IO :: Уведомления - PullRequest
5 голосов
/ 19 февраля 2020

Эти вложенные источники вызывают ошибку, но, видимо, только если внутренним источником является IO :: Notification. Похоже, что это не проблема для любого другого источника:

my $supply = IO::Notification.watch-path( "/var/log/syslog" );

my $parsed = supply {
    $supply.tap: -> $v {
        emit( { Seen => $v.event }  );
        CATCH {
            default {
                $*ERR.say: .message;
            }
        }
    }
}

$parsed.tap( -> $v { say $v });

sleep 40;

Это ошибка, выдаваемая:

emit without supply or react
emit without supply or react

(при возникновении события, которое вызывает подачу). Я не смог воспроизвести это в других видах вложенных материалов, но это всегда не получается. Есть идеи почему?

1 Ответ

7 голосов
/ 19 февраля 2020

Вы должны использовать whenever, чтобы подписаться на $supply, иначе подписка не будет связана с блоком supply (и поэтому, кроме emit, не работающего, также не получит контроль параллелизма, управление подписками и т. д.).

my $supply = IO::Notification.watch-path( "foo" );

my $parsed = supply {
    # Solution: use `whenever` here
    whenever $supply -> $v {
        emit( { Seen => $v.event }  );
        CATCH {
            default {
                $*ERR.say: .message;
            }
        }
    }
}

$parsed.tap( -> $v { say $v });

sleep 40;

(Возможно, иногда это срабатывает: если вы подписываетесь на что-то, что выдает значения синхронно после касания, обработчик emit окажется в области динамического c фазы установки блока supply, поэтому в этом случае он может работать.)

...