簡體   English   中英

當分別定義lambda表達式時,訪問父lambda參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM