RxJS Observable在上一次完成时发出

时间:2018-06-06 03:17:04

标签: rxjs

我有一个动态的对象数组,我需要同步处理。我只会在运行时知道数组中的对象数。处理每个对象包括调用一个方法,该方法在完成其工作时将发出进度通知。每个物体的处理时间会有很大差异(从30-40秒到约5分钟)。

RxJS版本5.5.6

所以基本上,我需要:

  1. 发射物体1
  2. 处理对象1
  3. 发射物体2
  4. 处理对象2
  5. (对数组中的所有 n 对象继续。)

    我不知道在调用前一项的complete回调之前,如何让observable等待发出下一个对象。

    我看过一堆运算符,而我最接近的运算符是merge,但它仍在同时处理所有网站。这是我的代码目前所在的位置:

    在我的服务中:

    const allObs: Array<Observable<string>> = [];
    const siteObserver: Observer<string> = {
      next: (s: string) => console.log(s),
      error: (error: string) => {},
      complete: () => console.log('complete')
    };
    activeSites.map((site: MatchSite) => {
      const obs: Observable<string> = Observable.create((masterObserver: Observer<string>) => {
        site.process().subscribe((x: string) => console.log(x));
        masterObserver.next(site.tag + ' processing');
      });
      allObs.push(obs);
    });
    const all: any = Rx.Observable.merge(...allObs);
    const sub: Subscription = all.subscribe(siteObserver);
    

    在站点对象中,process看起来像这样(现在只是一个间隔/超时模拟试图使其工作而不会使实际处理代码复杂化):

    process(): Observable<string> {
        const obs: Observable<string> = Observable.create((observer: Observer<string>) => {
          const int: any = setInterval(() => {
            observer.next('downloading ' + this.tag);
          }, 500);
          setTimeout(() => {
            clearInterval(int);
            console.log('download done: ' + this.tag);
            observer.complete();
          }, 2000);
        });
        return obs;
      }
    

    简而言之,我看到了这一点:

    ...
    downloading siteA
    downloading siteB
    downloading siteC
    downloading siteD
    downloading siteA
    downloading siteB
    downloading siteC
    downloading siteD
    ...
    

    当我想要的是这个:

    ...
    downloading siteA
    downloading siteA
    downloading siteB
    downloading siteB
    downloading siteC
    downloading siteC
    downloading siteD
    downloading siteD
    ...
    

    有人可以指出我正确的方向吗?

    谢谢,

    TTE

    更新

    当我将{1}的并发添加到merge或使用concat时,第一个网站会被处理两次,而不会处理其他网站。现在我真的很困惑......

    我无法弄清flatMap在这种情况下的工作方式,但我仍在努力。

0 个答案:

没有答案