簡體   English   中英

RxJS 中的 Rx.Observable.ForkJoin 和並行異步(使用 X-Ray)

[英]Rx.Observable.ForkJoin in RxJS and parallel async (using X-Ray)

我試圖弄清楚如何基於使用lapwinglabs/x-ray webscraper 的網站解析數據流並行運行(在本例中為 10)異步函數。

let pauser = new Rx.Subject()
let count = 0
let max = 10

// function that parse a single url to retrieve data
// return Observable
let parsing_each_link = url => {
   return Rx.Observable.create(
      observer => {
         xray(url, selector)((err, data) => {
            if (err) observer.onError(err)
            observer.onNext(data)
            observer.onCompleted()
         })
    })
}
 
// retrieve all the urls from a main page => node stream
let streamNode = xray(main_url, selector)
   .paginate(some_selector)
   .write()
   .pipe(JSONStream.parse('*'))

// convert node stream to RxJS
let streamRx = RxNode.fromStream(streamNode)
   .do(() => {
      if (count === max) {
         pauser.onNext(true)
         count = 0
      }
   })
   .do(() => count++)
   .buffer(pauser) // take only 10 url by 10 url
   
streamRx.subscribe(
   ten_urls => {
      Rx.Observable.forkJoin(
         ten_urls.map(url => parsing_each_link(url))
      )
      .subscribe(
         x => console.log("Next : ", JSON.stringify(x, null, 4))
      )
   }
)

最后一個 console.log 上的 Next 永遠不會被調用?!?

無法確定,但如果您可以確保按預期發出ten_urls ,那么下一步是確保 observable parsing_each_link確實完成,因為forkJoin將等待其每個源 observables 的最后一個值。 我在您的代碼中看不到對observer.onComplete任何調用。

暫無
暫無

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

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