【发布时间】:2019-08-03 01:05:55
【问题描述】:
我想要实现的是向 api 发出多个请求,合并和排序结果并将其分配给 this.products$ observable。这主要是因为代码现在看起来(见下文),最终结果最终变成了一个列表。
fetchIds() 方法从存储中获取参数。 sliceToArrays(any[], number) 接收参数列表并将其拆分为更小的部分。我这样做的原因是为了避免 GET 方法 this.api.listProducts([],'') 的 url 太长,因为 url 查询有一个最大字符限制,当有太多 Id 时会受到影响.
我面临的问题是,除了我以错误的方式使用它的痛苦感觉之外,我无法让它对合并的结果进行排序;它对 2 个列表进行排序,然后再组合它们,使其看起来像这样 [A, B, C, A, B, C] 而不是 [A, A, B, B, C, C]。
ngOnInit() {
this.pageSize = 100;
this.products$ = this.fetchIds().pipe(
mergeMap(ids =>
forkJoin(this.sliceToArrays(ids, this.pageSize).map(idsList => this.api.listProducts(idsList, 'watchlist'))).pipe(
mergeMap(products => merge(...products)),
toArray(),
map(products => sortBy(products, ['inventoryStatus', 'authorLastFirst']))
))); }
sliceToArrays(input: any[], maxSliceSize: number): any[][] {
const slices = Math.floor((input.length + maxSliceSize - 1) / maxSliceSize);
const collection: any[][] = [];
for (let i = 1; i <= slices; i++) {
collection.push(input.slice((i - 1) * maxSliceSize, i * maxSliceSize));
}
return collection; }
fetchSkus() {
return this.watchListStore.items.pipe(
filter(watchlist => watchlist !== null),
map(watchlist => watchlist.map(i => i.id))
); }
谁能指出我正确的方向?这几天我一直在尝试不同的东西,但这(角度、打字稿等)并不是我真正的专业领域。
【问题讨论】:
-
为什么要在客户端做这一切?为什么不在服务器上?
-
我想主要原因是方便和灵活。已经存在用于在后端通过 id 获取产品的良好、灵活的框架,并且简单地将前端从进行 1 次调用更改为进行 X 次调用似乎比在服务器上的控制器中为这种特定用途创建一个全新的方法要好。跨度>
标签: angular typescript rxjs angular6 angular-httpclient