Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJS可观测在上一个完成时发出_Rxjs - Fatal编程技术网

RxJS可观测在上一个完成时发出

RxJS可观测在上一个完成时发出,rxjs,Rxjs,我有一个需要同步处理的动态对象数组。在运行时,我只知道数组中的对象数。处理每个对象包括调用一个方法,该方法将在完成其工作时发出进度通知。每个对象的处理时间会有很大差异(从30-40秒到~5分钟) RxJS版本5.5.6 所以基本上,我需要: 发射对象1 进程对象1 发射对象2 进程对象2 (对数组中的所有n个对象继续) 我不知道如何让observable等待发出下一个对象,直到调用前一项的complete回调 我看了很多运营商,最近的一个是merge,但它仍然同时处理所有站点。以下是我的代码当前

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

RxJS版本5.5.6

所以基本上,我需要:

  • 发射对象1
  • 进程对象1
  • 发射对象2
  • 进程对象2
  • (对数组中的所有n个对象继续)

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

    我看了很多运营商,最近的一个是
    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);
    
    简而言之,我看到了:

    ...
    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
    在这种情况下如何工作,但我仍在努力。

    使用
    concat
    而不是
    merge
    。或者在对
    merge
    的调用中指定一个
    concurrency
    ——这就是
    concat
    的实现方式。基于第一段,我建议基于数组创建一个流,并使用
    flatMap
    。我觉得你的方法很混乱,所以我可能遗漏了什么。
    ...
    downloading siteA
    downloading siteA
    downloading siteB
    downloading siteB
    downloading siteC
    downloading siteC
    downloading siteD
    downloading siteD
    ...