stratadox / observation-queue
v0.1
2018-01-26 15:36 UTC
Requires
- php: >=7.1
Requires (Dev)
- phpunit/phpunit: ^6.5
- rpkamp/fancy-testdox-printer: ^0.2.5
- satooshi/php-coveralls: ^2.0
This package is auto-updated.
Last update: 2024-09-29 05:21:05 UTC
README
观察者的保障,防止调用顺序中的问题。
安装
使用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 A
在 Observer 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();