[英]Return an array/object instead of an observable using RXJS map
我有以下代碼,它返回一個帶有每個項鍵的項詳細信息的observable:
this.list = this.af.database.list("API_URL")
.map((ItemKeys) => {
return ItemKeys.map((ItemKey) => {
return this.af.database.object(API_URL + "/" + ItemKey); //I need this as the object (not observable)
});
}).subscribe((items) => {
this.lineData = items; //A list of observables
});
代碼迭代每個項密鑰並從另一個端點獲取項數據。 問題是它重新編譯每個項目數據的可觀察量,我需要它在一個對象(可觀察的結果)中。
我嘗試使用以下代碼返回訂閱結果,但隨后我的所有項目數據都為空(未定義):
this.list = this.af.database.list("API_URL")
.map((ItemKeys) => {
return orderItemKeys.map((ItemKey) => {
this.af.database.object("API_URL" + "/ItemKey.$key) // So I tried to subscribe to this..
.subscribe((data) => {
return data;
});
});
}).subscribe((items) => {
this.lineData = items; // A list with undefined items
});
如何將項數據對象作為對象返回,而不是在我的情況下作為對象的可觀察對象?
不要在運營商內返回訂閱(來自訂閱)。 那可能不是你想打算做的。
對於檢索對象列表的內部部分,您應該能夠將從Array#map()
創建的可觀察Array#map()
轉換為具有Observable#from()
的高階observable。 您需要mergeAll()
將這一系列的observable恢復為單個流,然后使用toArray()
將所有發出的項收集到一個數組中。 然后使用mergeMap()
提取最后一個observable。
this.list = this.af.database.list("API_URL")
.mergeMap((ItemKeys) => {
return Observable.from(ItemKeys.map((ItemKey) => {
return this.af.database.object(API_URL + "/" + ItemKey);
})).mergeAll().toArray();
})
.subscribe((items) => {
this.lineData = items;
});
你應該用flatMap
替換map
,因為它能夠展平Observable<Observable<T>>
。
var responseStream = requestStream
.flatMap(function(requestUrl) {
return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
});
responseStream.subscribe(() => {});
嘗試調整和簡化您的代碼
const databaseList = () => Rx.Observable.from(['a6b54x4', '1e23sa4q']);
const databaseObject = (id) => Rx.Observable.of({ id, status: 'ok' })
databaseList()
.flatMap(x => databaseObject(`id/${x}`))
.reduce((x, y) => x.concat(y), [])
.subscribe(console.log);
基本上,它仍然使Observable<Observable<T>>
變平,然后使用reduction,將所有內容合並到一個結果數組中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.