Skip to content

Commit 400f69b

Browse files
Merge pull request #1301 from jbripley/subscription-block-expression
RxScala: Add convenience method for adding unsubscription callback
2 parents 5b5d58f + 9c74545 commit 400f69b

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Subscriber.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@ trait Subscriber[-T] extends Observer[T] with Subscription {
2020
asJavaSubscriber.add(s.asJavaSubscription)
2121
}
2222

23+
/**
24+
* Register a callback to be run when Subscriber is unsubscribed
25+
*
26+
* @param u callback to run when unsubscribed
27+
*/
28+
final def add(u: => Unit): Unit = {
29+
asJavaSubscriber.add(Subscription(u).asJavaSubscription)
30+
}
31+
2332
override final def unsubscribe(): Unit = {
2433
asJavaSubscriber.unsubscribe()
2534
}

language-adaptors/rxjava-scala/src/test/scala/rx/lang/scala/SubscriberTests.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,19 @@ class SubscriberTests extends JUnitSuite {
4242
assertTrue(innerSubscriber.isUnsubscribed)
4343
}
4444

45+
@Test def testBlockCallbackOnlyOnce() {
46+
var called = false
47+
val o = Observable[Int](subscriber => {
48+
subscriber.add({ called = !called })
49+
})
50+
51+
val subscription = o.subscribe()
52+
subscription.unsubscribe()
53+
subscription.unsubscribe()
54+
55+
// Even if called multiple times, callback is only called once
56+
assertTrue(called)
57+
assertTrue(subscription.isUnsubscribed)
58+
}
59+
4560
}

0 commit comments

Comments
 (0)