簡體   English   中英

將 Node 流轉換為 Rx.js Observables

[英]Converting Node streams into Rx.js Observables

我正在努力將 Node 流轉換為 Rxjs Observables。

當我嘗試 1 個 URL 時,流式傳輸本身效果很好。但是,當我嘗試在一組 URL 上映射相同的函數時,我收到錯誤消息。

我正在使用 Rx.Node 將流轉換為 Observable。

這就是我目前正在嘗試的

// data_array is an array of 10 urls that I'm scraping data from. 
let parentStream = Rx.Observable.from(data_array);

parentStream.map(createStream).subscribe(x => console.log(x), (e)=> console.log('Error', e), console.log('Complete'));

function createStream(url){
  return RxNode.fromStream(x(url, '#centercol ul li', [{name: 'a', link: 'a@href'}]).write().pipe(JSONStream.parse('*')))
}

但這是輸出X 10(data_array中的URL數)

RefCountObservable {
 source:
  ConnectableObservable {
   source: AnonymousObservable { source: undefined, __subscribe: [Function] },
 _connection: null,
 _source: AnonymousObservable { source: [Object], __subscribe: [Function: subscribe] },
 _subject:
  Subject {
    isDisposed: false,
    isStopped: false,
    observers: [],
    hasError: false } },
_count: 0,
_connectableSubscription: null }

我首先認為 flatMap 會起作用,因為它在一個 observable 中展平了 observable....但是當我嘗試 flatMap 時,我得到了這個:

Complete
Error TypeError: unknown type returned

但是,如果我這樣做:

這適用於 1 URL ,但我無法在一個流中捕獲 data_array 中的所有 URL。

let stream = RxNode.fromStream(x(url, '#centercol ul li', [{name: 'a', link: 'a@href'}]).write().pipe(JSONStream.parse('*')))

stream.subscribe(x => console.log(x), (e)=> console.log('Error', e), console.log('Complete'))

我覺得我誤解了一些東西,不僅因為它清除對多個 URL 不起作用,而且即使它在第二個示例中起作用......我在所有數據進入之前首先得到“完成”。

顯然,我誤解了一些東西。 任何幫助都會很棒。 謝謝。

*更新*

我嘗試了不同的路徑,它有效,但不使用節點流。 節點流將是理想的,所以仍然想讓上面的例子工作。

我接下來使用的方法是在我的網頁抓取功能周圍包裝一個 promise,即下面的抓取 這是有效的,但結果是十個巨大的數組,每個數組中包含來自每個 URL 的所有數據。 我真正想要的是一個對象流,我可以在數據對象通過時組成一系列轉換。

這是不同的,但工作方法:

let parentStream = Rx.Observable.from(data_array);

parentStream.map(url => {
    return Rx.Observable.defer(() => {
        return scrape(url, '#centercol ul li', [{name: 'a', link: 'a@href'}]);
    })
})
    .concatAll()
    .subscribe(x => console.log(x), (e)=> console.log('Error', e), console.log('Complete'));

function scrape(url, selector, scope) {
    return new Promise(
        (resolve, reject) => x(
            url,
            selector,
            scope
        )((error, result) => error != null ? reject(error) : resolve(result))
    );
}

*解決方案*我想通了。 我附上了下面的解決方案:

我選擇使用 Rx.Observable.fromEvent(),而不是使用 RxNode。

節點流會發出事件,無論是新數據、錯誤還是完成。

因此fromEvent靜態運算符正在偵聽 'data' 事件並為每個事件創建一個新的 Observable。

然后我合並所有這些,然后訂閱。 這是代碼:

let parentStream = Rx.Observable.from(data_array);
parentStream.map((url)=> { return createEventStream(url); } ).mergeAll().subscribe(x => console.log(x), (e)=> console.log('Error', e), console.log('Complete'));

function createEventStream(url){
  return Rx.Observable.fromEvent(x(url, '#centercol ul li', [{name: 'a', link: 'a@href'}]).write().pipe(JSONStream.parse('*')), 'data');
}

暫無
暫無

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

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