簡體   English   中英

如何鏈接由生成器函數生成的Observable?

[英]How to chain Observables produced by a generator function?

假設我有一個生成器函數,該函數返回與它需要執行的操作序列相對應的多個可觀察值。 這里的要點是,一個操作的結果可以在其他操作中明確使用,或者在生成器函數本身中使用

例如:

* doImportFile(fileName) {
  let foo = false
  yield bindNodeCallback(fsextra.readdir)(fileName).pipe(map(r => {
    foo = true
    return 0
   }))

  if (foo) {
     yield of(1)
  } else {
    yield of(2)
  }

}

現在,如果您使用類似的方法將它們鏈接在一起

concat(doImportFile(fileName)).pipe(concatAll()) 

您將無法獲得預期的行為。 foo在評估時為假,並且將產生of(2)。

更明顯的方法是執行以下操作:

async performOperations(fileName) {
  for(const op of doImportFile(fileName)) {
    await op
  }
}

這實際上會產生我想要的結果。 問題(顯然)是concat接受一個數組,並且生成該數組時並沒有實際訂閱(或等待)它產生的任何可觀察對象。

因此,除了循環播放之外,還有什么方法可以做我想要的? 如果不是,您將如何更改performOperations以返回doImportFile輸出的連接結果?

在這一點上,我的猜測是潛在的問題是我試圖在生成器函數中混合使用函數式和聲明式編程。 解決此問題的一種方法是完全發揮功能,例如

* doImportFile(fileName) {
    let foo = false
    yield bindNodeCallback(fsextra.readdir)(fileName).pipe(map(r => {
      foo = true
      return 0
    }))
  yield iif(() => foo, of(1), of(2))
}

這實際上是可行的,但感覺很麻煩。 本質上只需要一個concat運算符,它需要一個可迭代的而不是一個數組...對嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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