【问题标题】:rxjs call 2 services per item in a array in a intervalrxjs 在间隔中为数组中的每个项目调用 2 个服务
【发布时间】:2021-09-02 06:16:56
【问题描述】:

我有一个“N”个 ID 数组,我想为每个项目消耗 2 个服务,并用计时器将所有服务包装在一个 forkjoin 中,因为我不想同时发送 1000 个请求,我希望每个项目在 10 秒内处理完毕,想法是在订阅时知道哪些 id 已处理,哪些未处理。

var arraytoprocess=[...this.selection.selected]; //array of ids
var arraytoprocessObs$=[];
for (let index = 0; index < arraytoprocess.length; index++)
{
  const obs1$=this._api.service1(+arraytoprocess[index].id);
  const obs2$=this._api.service2(+arraytoprocess[index].id);
  const obs$=forkJoin([obs1$,obs2$])
  arraytoprocessObs$.push(obs$)
}
//call each item of the arraytoprocessObs$ per 10 seconds 
magiccodewithpipes().subcribe()

【问题讨论】:

  • 为什么不在任何时候都像 5 个并行调用这样的池?感觉比在 2 个调用之间选择任意 10 秒等待更优化。
  • 我不并行发送 5 个调用,因为我知道 api 在某些情况下可能会被巨大的消耗阻塞,因为在某些情况下为进程选择的 id 可以达到 10 000 个 id *2,而其他修复并发性能

标签: arrays angular rxjs


【解决方案1】:

最后,我在Limit concurrent http requests with RxJS and Angular2 的帮助下弄清楚了这个方法,它的作用就像一个魅力,每 5 秒处理每个项目,我可以像一个一样管理两个观察。

import { Component, OnInit, AfterViewInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { concat, forkJoin, from, Observable, of } from 'rxjs';
import { concatMap, delay, flatMap, tap } from 'rxjs/operators';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit, AfterViewInit {
  todos: Array<Todo>;

  constructor(private http: HttpClient) {
    this.http.get('https://jsonplaceholder.typicode.com/todos');
  }

  ngOnInit(): void {
    console.log('ngOnInit');

    var arraytoprocess = [1, 2, 3, 4, 5, 6, 7, 9, 10];
    var arraytoprocessObs$ = [];
    for (let index = 0; index < arraytoprocess.length; index++) {
      const obs1$ = this.http.get(
        'https://jsonplaceholder.typicode.com/users/' + arraytoprocess[index]
      );
      const obs2$ = this.http.get(
        'https://jsonplaceholder.typicode.com/users/' + arraytoprocess[index]
      );
      const obs$ = forkJoin([obs1$, obs2$]);
      arraytoprocessObs$.push(obs$);
    }

    concat(...arraytoprocessObs$)
      .pipe(
        tap(x => console.log(x)),
        //flatMap(x => fetch(x), null, 5)
        concatMap(item => of(item).pipe(delay(5000)))
      )
      .subscribe(response => {
        console.log('asd' + JSON.stringify(response));
      });
  }

  ngAfterViewInit(): void {
    console.log('ngAfterViewInit');
  }
}
export interface Todo {
  userId: number;
  id: number;
  title: string;
  completed: boolean;
}

stackblitz sample

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2020-09-28
    • 2015-03-10
    • 2021-05-20
    • 1970-01-01
    • 2016-09-08
    • 2016-06-13
    相关资源
    最近更新 更多