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