遍历顺序API调用Rxjs(链表)
Traversing sequential API calls Rxjs (Linked List)
如何遍历链表结构中的顺序 API 调用?现在,我每 5 秒发出一次请求,获取 OrdersList
数据。该对象包含一个字段 results
,其中包含一个 Order
对象数组,它还包含一个 next
字段,其中包含一个请求 URL 以访问下一个订单数组,因为它们不是一次性全部发送。
我的orders.component.ts
:
ngOnInit(): void {
this.subscription = timer(0, 5000).pipe(
switchMap(() => this.apiManager.fetchShopOrders())
).subscribe(orders => {
const loadedOrders: OrdersList = orders;
/* not working - try to get next set(s) of orders */
if(loadedOrders.next != null){
while(loadedOrders.next != null){
let response = this.apiManager.fetchNextSetOfOrders(loadedOrders.next).toPromise();
response.then((nextSetOrders) => {
const loadedNextSetOrders: OrdersList = nextSetOrders;
loadedOrders.next = loadedNextSetOrders.next;
loadedOrders.results = [...loadedOrders.results, ...loadedNextSetOrders.results];
})
}
}
...
/* do stuff with the orders */
...
});
}
我的ApiManagerService
:
@Injectable({ providedIn: 'root' })
export class ApiManagerService {
private API_KEY = "...";
private API_SECRET = "...";
private token = "...";
private webzine_id: string = "...";
constructor(private http: HttpClient) {}
fetchShopOrders() {
const url = "https://commerce.ww-api.com/commerceapi/v1/order/" + this.webzine_id + "/order/?per_page=10";
return this.http
.get<OrdersList>(url, {
headers: new HttpHeaders({
"API-KEY": this.API_KEY,
"API-SECRET": this.API_SECRET
}),
});
}
fetchNextSetOfOrders(nextSetUrl: string) {
return this.http
.get<OrdersList>(nextSetUrl, {
headers: new HttpHeaders({
"API-KEY": this.API_KEY,
"API-SECRET": this.API_SECRET
}),
});
}
}
如何才能按顺序将下一组订单添加到我的 OrdersList
对象?
提前致谢。
您可以使用 expand
运算符递归 link 列表并获取数据 sequantially/recursively。
主要代码:
ngOnInit() {
this.apiManager
.fetchShopOrders()
.pipe(
expand(res => {
if (res.results) {
this.results.push(...res.results);
}
if (res.next) {
return this.apiManager.fetchNextSetOfOrders(res.next);
}
return of(EMPTY);
}),
takeWhile(res => !!res.next) // take while res.next is defined
)
.subscribe(console.log);
}
如何遍历链表结构中的顺序 API 调用?现在,我每 5 秒发出一次请求,获取 OrdersList
数据。该对象包含一个字段 results
,其中包含一个 Order
对象数组,它还包含一个 next
字段,其中包含一个请求 URL 以访问下一个订单数组,因为它们不是一次性全部发送。
我的orders.component.ts
:
ngOnInit(): void {
this.subscription = timer(0, 5000).pipe(
switchMap(() => this.apiManager.fetchShopOrders())
).subscribe(orders => {
const loadedOrders: OrdersList = orders;
/* not working - try to get next set(s) of orders */
if(loadedOrders.next != null){
while(loadedOrders.next != null){
let response = this.apiManager.fetchNextSetOfOrders(loadedOrders.next).toPromise();
response.then((nextSetOrders) => {
const loadedNextSetOrders: OrdersList = nextSetOrders;
loadedOrders.next = loadedNextSetOrders.next;
loadedOrders.results = [...loadedOrders.results, ...loadedNextSetOrders.results];
})
}
}
...
/* do stuff with the orders */
...
});
}
我的ApiManagerService
:
@Injectable({ providedIn: 'root' })
export class ApiManagerService {
private API_KEY = "...";
private API_SECRET = "...";
private token = "...";
private webzine_id: string = "...";
constructor(private http: HttpClient) {}
fetchShopOrders() {
const url = "https://commerce.ww-api.com/commerceapi/v1/order/" + this.webzine_id + "/order/?per_page=10";
return this.http
.get<OrdersList>(url, {
headers: new HttpHeaders({
"API-KEY": this.API_KEY,
"API-SECRET": this.API_SECRET
}),
});
}
fetchNextSetOfOrders(nextSetUrl: string) {
return this.http
.get<OrdersList>(nextSetUrl, {
headers: new HttpHeaders({
"API-KEY": this.API_KEY,
"API-SECRET": this.API_SECRET
}),
});
}
}
如何才能按顺序将下一组订单添加到我的 OrdersList
对象?
提前致谢。
您可以使用 expand
运算符递归 link 列表并获取数据 sequantially/recursively。
主要代码:
ngOnInit() {
this.apiManager
.fetchShopOrders()
.pipe(
expand(res => {
if (res.results) {
this.results.push(...res.results);
}
if (res.next) {
return this.apiManager.fetchNextSetOfOrders(res.next);
}
return of(EMPTY);
}),
takeWhile(res => !!res.next) // take while res.next is defined
)
.subscribe(console.log);
}