stratadox/observation-queue

v0.1 2018-01-26 15:36 UTC

This package is auto-updated.

Last update: 2024-09-29 05:21:05 UTC


README

Build Status Coverage Status Scrutinizer Code Quality

观察者的保障,防止调用顺序中的问题。

安装

使用composer安装

composer require stratadox/observation-queue

为什么使用这个?

如果你有观察者和可观察对象被大量使用的情况,请使用这个。

观察者默认情况下有几个相当棘手的问题。例如,重新进入可能会引起难以找到的bug。

示例

让我们看看以下场景

We have two observables, Foo and Bar.
Observer A observes Foo, triggering Bar on update.
Observer B observes both Foo and Bar.
Foo gets triggered.

这里会发生什么?

由于 Observer AObserver B 注册之前已经注册到 Foo,因此首先更新 Observer A。更新 Observer A 触发 Bar,进而导致 Bar 更新其订阅者。

听起来有道理,对吧?但是这里有个棘手的地方:此时,Foo 还没有更新 Observer B

当然,Observer B 最终会由 Foo 更新。但只有在收到 Bar 的更新之后。

另一种选择

在观察者可以触发可观察对象的更新,并且相关观察者的执行顺序很重要的情况下,使用 ObservationQueue 可能是明智的。

ObservationQueue 是所有还需要发送给观察者的消息的队列。可观察对象将它们的项添加到队列中,然后继续触发队列的执行。

由于这个排队层,观察者通知是按照可观察对象被触发的顺序处理的。

代价是什么?

尽管软件的货币价格为零,但使用这种机制确实引入了一些共享的可变状态。为了使队列有任何效果,需要多个可观察对象获得访问权限。

基本用法

通常,更新可观察对象的订阅者会大致如下

foreach ($this->subscribers as $subscriber) {
    $subscriber->notify($this);
}

当使用观察队列时,改为使用以下方法

foreach ($this->subscribers as $subscriber) {
    $this->queue->add($subscriber, 'notify', $this);
}
$this->queue->trigger();