[英]Access parent lambda parameters when lambda expressions defined individually
在一個RxJava2 / RxKotlin應用,我訂閱的Observable
內部Consumer<T>
傳遞到另一個的訂閱方法Observable
,像這樣:
Observable.defer{ T.toObservable() }
.delaySubscription(1, TimeUnit.MINUTES)
.subscribeOn(schedulerOne)
.observeOn(Schedulers.io())
.filter { t -> "TestName" == t.name }
.subscribe {t ->
Observable.interval(1, TimeUnit.SECONDS) // Start Consumer 1
.subscribeOn(schedulerOne)
.take(6)
.doOnComplete{ t.action() }
.subscribe { i: Int ->
t.anotherAction() // Consumer 2
}
}
}
但是,為了清理代碼,我想將使用者1和使用者2分成各自的val
。 問題是我無法為消費者2創建一個lambda,因為它取決於t
而且我無法知道“通知” lambda作用域中將存在另一個變量,該變量不是參數。 您有什么建築建議嗎?
謝謝。
編輯 :我知道我應該在subscribe
之外定義內部Observable
,但是我將所有這些都包括在內,以提供對正在發生的事情的看法。
您的第二個使用者不依賴任何東西,因此首先將其定義為自己的功能:
val consumer2 = (T) -> Unit = { it.anotherAction() }
現在,consumer1不需要明確地了解其內部消費者的行為。 因此,例如,您可以這樣定義它,但它被定義為一個fun
,而不是val
:
fun consumer1(innerConsumer: (T) -> Unit): (T) -> Unit {
return { t -> Observable.interval(1, TimeUnit.SECONDS)
.subscribeOn(schedulerOne)
.take(6)
.doOnComplete{ t.action() }
.subscribe { i: Int ->
innerConsumer(t)
}
}
}
最終的代碼將變為:
Observable.defer{ T.toObservable() }
.delaySubscription(1, TimeUnit.MINUTES)
.subscribeOn(schedulerOne)
.observeOn(Schedulers.io())
.filter { t -> "TestName" == t.name }
.subscribe { t ->
val totalConsumer = consumer1(consumer2)
totalConsumer(t)
}
如果你真的希望它是一個val
,你不關心consumer1
使用consumer2
內部,就變成這樣:
val consumer1: (T) -> Unit = { t ->
Observable.interval(1, TimeUnit.SECONDS)
.subscribeOn(schedulerOne)
.take(6)
.doOnComplete{ t.action() }
.subscribe { i: Int ->
consumer2(t)
}
}
然后您的最終代碼將如下所示:
Observable.defer{ T.toObservable() }
.delaySubscription(1, TimeUnit.MINUTES)
.subscribeOn(schedulerOne)
.observeOn(Schedulers.io())
.filter { t -> "TestName" == t.name }
.subscribe { t -> consumer1(t) }
與此相關的:而不是開始一個新的Observable
一個內subscribe
方法,你有沒有考慮過使用flatMap
?
希望這對您有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.