我有一個REST端點,它返回一個項目列表,最多1000個項目一次。如果有超過1000個項目,則響應的HTTP狀態爲206,並且有一個Next-Range
標題,我可以在我的下一個獲取更多項目的請求中使用它。Angular 2 Http,Observables和遞歸請求
我正在的角2應用,並試圖與Http
和Observable
來實現這一點。我的問題是我不知道如何合併多個Observable
s取決於有多少頁面的項目,並且最終返回一個Observable
我的組件可以訂閱。
這裏就是我和我目前的打字稿實現了:
// NOTE: Non-working example!
getAllItems(): Observable<any[]> {
// array of all items, possibly received with multiple requests
const allItems: any[] = [];
// inner function for getting a range of items
const getRange = (range?: string) => {
const headers: Headers = new Headers();
if (range) {
headers.set('Range', range);
}
return this.http.get('http://api/endpoint', { headers })
.map((res: Response) => {
// add all to received items
// (maybe not needed if the responses can be merged some other way?)
allItems.push.apply(allItems, res.json());
// partial content
if (res.status === 206) {
const nextRange = res.headers.get('Next-Range');
// get next range of items
return getRange(nextRange);
}
return allItems;
});
};
// get first range
return getRange();
}
但是,這是行不通的。如果我的理解正確,則Observable
將返回爲初始Observable
的值,而不是項目的數組。
出於某種原因,這不能正常工作。我在此添加了簡化代碼示例和更多評論:https://gist.github。com/roxeteer/76789931e82f38061b0d33d4fdc06c70 –
我試圖用你的代碼更新JSBIN,這似乎按預期工作(對http嘲諷進行了小的修改)。 http://jsbin.com/nosohom/edit?js,console如果這不起作用,你能否給我提供一個錯誤的jsbin例子? – KwintenP
奇怪。你的代碼看起來很相似,但它在Angular 2中的工作方式仍然不同。我通過修改訂閱者使用「完成」處理程序來修復它。看到我的答案:http://stackoverflow.com/a/40543794/587337 –