2017-09-05 28 views
4

合併可觀察我需要做一個函數返回一個可觀察到的一點幫助。我有一個函數(讓我們稱之爲mainFunction),調用異步函數(姑且稱之爲getAsyncWithCallback)和執行的回調。回調的一部分是一個異步調用返回一個可觀察到的(姑且稱之爲getData)。RxJS回調

getAsyncWithCallback是一個庫的一部分,我不能改變它。

這是我有:

mainFunction(){ 
    getAsyncWithCallback(() => { 
     let myObservable = getData(); 
    }); 
} 

這就是我想做的事:

mainFunction().subscribe((data) => { 
    // data is the data from getData() 
}); 

什麼是實現這一目標的最佳途徑,而鏈的錯誤和完成形成內?

+0

如果他們沒有返回'myObservable'(或將它分配到某個地方),我認爲你沒有多少可以做... – acdcjunior

+0

我很確定你可以使用承諾並將其轉換爲可觀察。我沒有IDE atm爲您提供示例。 – MistyK

+0

回調是我可以更改的代碼。我在裏面定義了'myObservable'。 – Grey

回答

1

我的解決方案:

mainFunction(): Observable<any> { 

    return Rx.Observable.create(observer => { 
     getAsyncWithCallback((): void => { 
      getData().subscribe(observer); 
     }) 
    }) 
} 

mainFunction().subscribe((data) => { 
    console.log(data); 
})); 
+0

這將創建一個可觀察的,因爲觀測的'getData'返回'Observable'。我認爲你需要在某處放置一個'mergeMap/flatMap'。 – Pace

+0

我改變它返回一個observable(哎呀!),我很好奇爲什麼合併或平面地圖? – Rex

+1

我認爲最好是用'getData()。subscribe(observer)'而不是使用運算符作爲@Pace建議 –

0

你會想從mainFunction返回可觀察到的。

如果的getData返回一些其他類型的對象不是可觀察,你會構建自己的可觀測與Observable.create

function mainFunction() { 
    return Observable.create((obs) => { 
    getAsyncWithCallback(() => { 
     getData() 
     .subscribe((data) => { obs.next(data); }) 
     .catch((err) => { obs.error(err) }); 
    }); 
    }); 
} 

mainFunction().subscribe(data => console.log(data)); 

從文檔:

創建onSubscription功能轉換爲一個實際的Observable。每當有人訂閱該Observable時,該函數將作爲第一個且唯一的參數與Observer實例一起調用。

使用值調用next會將該值發送給觀察者。

你最不應該需要使用創建的時代,因爲現有的運營商允許你創建一個可觀察到的大部分的使用情況。這就是說,如果你有非常特殊的需求,create是一個低級機制,允許你創建任何Observable。

還有Observable.from它將從數組,類似數組的對象,迭代器,Observable-like對象和Promise中創建Observables。

+0

第一個選項沒有解決這個問題,因爲我需要調用'getAsyncWithCallback()'。至於第二種選擇,它不會鏈接錯誤和完成。將這添加到我的問題。 – Grey

+1

@Grey不確定你的意思,在你的例子中你沒有處理回調失敗的情況,這應該是一個好的開始,但你可以使用obs.error()或obs.complete()來發信號可觀察的錯誤或完成。 –

+0

@RudolfOlah你不能在'.subscribe'後面執行'.catch',你不發送完成。最好寫一個'.subscribe(obs)',正如我在評論中所描述的另一個答案 –