2017-06-02 13 views
-1

有點僞代碼來解釋標題:RxJs獲得原始事件裏面沒有訂閱傳承

Subject source = new Subject(); 

    function sendInNewResource(newNumber, anotherVariable) { 
     source.next(newNumber); 
    } 

    const newSource = source 
    .map((myNumber) => myNumber++); 

    newSource.subscribe((data) => { 
     //How can I access myObject here? 
    }); 

    sendInNewResource(1, {myObject}); 

我覺得僞代碼說明一點的是我想做的事情。 到目前爲止,我試圖擴展observable,但是如果我這樣做,它看起來好像我需要重寫observable中的運算符。

我幾乎要提供元數據的事件。

我不想通過myObject的下降,因爲這是使用的庫外,我將訂閱我的代碼庫中的觀測,但鏈接的觀察到的將被放在外部。

人對如何實現這一目標的任何想法?

爲背景, 我試圖創建一個純粹的RxJs HTTP庫,讓我做到以下幾點:

const server$ = RxHttpServer(server) 

const api$ = server.filter((request) => request.url.startsWith('/api')); 

const apiEndpoint$ = api.map(() => ({ 
    status: 400, 
    body: 'this is an api endpoint', 
    headers: { 
    } 
})); 

// Inside my library, note the use of the response object that I don't have access to: 
apiEndpoint.subscribe((dataToSend) => response.write(dataToSend)) 

的內在邏輯和這些對象的處理已經寫入,只需要將該響應對象發送回。

+0

我在RxJS的知識是有限的,但是,你不必將myObject作爲參數傳遞給下一個? 'source.next(newNumber,myObject)'如果這是不可能的,你可以做一些參數解構'source.next({newNumber,myObject})'。 – Baruch

+0

@Baruch,這是我試圖通過這篇文章避免的一件事,因爲我不希望框架的用戶必須將響應傳遞給他們製作的每個鏈。如果你想象一個端點通過平面地圖調用另一個端點,你立即失去了響應,或者不得不在任何地方都使用選擇器函數,這對我來說會破壞可用性:) –

+0

你會考慮包裝'response'對象你需要一個可觀察的?在這種情況下,您可以'將'apiEndpoint $'和'$ $'合併到一起,然後在回調中訪問這兩個。 – atomrc

回答

0

你可以使用一個responseFor幫手,將採取響應的元數據,並返回一個觀察響應主題,每一個HTTP請求。庫用戶可以訂閱它並將數據寫入每個響應主題。在圖書館中,您可以訂閱相同的響應主題,並在完成後將其發送回客戶端。就像:

// even better extending the Observable prototype 
// const apiEndpoint$ = api$.mapResponseFor(... 
const apiEndpoint$ = api$.map(responseFor({ 
    status: 400, 
    body: 'this is an api endpoint', 
    headers: {} 
})); 

apiEndpoint$.subscribe(response => { 
    response.next(data) 
    response.complete() 
}) 
+0

也許我不明白你的意思是什麼,但是一個類型響應的主題不會真正起作用 - 如果我們有一個需要2秒響應的請求和另一個可以立即處理的請求,那麼第一個請求(慢速請求)將由第二個可觀察者處理。 同樣,也許我得到這完全錯誤,responseFor方法會做什麼? :) –

+0

它取決於'apiEndpoint $'觀察者所做的事情。如果速度慢意味着做了一些其他的異步調用,並在此之後完成響應,它會沒事的。異步調用將被安排,javascript將立即從第一個觀察者的代碼返回,並且下一個觀察者將被提供。如果慢表示實際計算,則第一個觀察者將被阻止,第二個觀察者將不被服務。但是,這只是單線程的問題。您需要一些平臺特定的併發性方法,即您可以將處理代碼封裝在Web Worker中。 –

+0

您可以做的另一件事是在每個響應主題上調用'responseSubject.observeOn(Rx.scheduler.async)'。這將確保當用戶執行'response.next(data)'時它不會被同步執行,給其他觀察者一些時間來處理。但是,如果計算'data'的計算是同步的並且很長(就像在代碼中有睡眠一樣),它仍然會阻塞主JavaScript線程。 –