函数返回后 Observable.forkJoin 调用延迟

Posted

技术标签:

【中文标题】函数返回后 Observable.forkJoin 调用延迟【英文标题】:Observable.forkJoin call delayed after return of function 【发布时间】:2017-01-19 18:29:14 【问题描述】:

在组件中,我们订阅了来自服务的两个 http 返回结果,并且在服务中,两个 http 调用返回了可观察的。

在组件打字稿中

catalogPromise = this.ondemandService.getVodCatalog().subscribe((data) => 
        console.log(data);

        );

服务中:-

    getVodCatalog(url,user)
    return this.getVodCategories().map((data) => 
            let result,result2;
            let Observers = [],
            cats = [],
            catalogs = [];

            result=data.json();
            result.categorylist.forEach((catergory) => 
                cats.push(catergory.name);
                Observers.push(this.getCategoriesCatolog(catergory.id,));
            );
            console.log(Observers);
            Observable.forkJoin(Observers).subscribe((vodCatalogs)=> 
                vodCatalogs.forEach((vodeCatalog,idx)=>
                    let v1 = vodeCatalog.json();
                    if(v1.vodlist)
                    
                        catalogs.push(
                            label: cats[idx],
                            list: v1.vodlist
                            );
                    
                );
                return catalogs;
            );

        )
    .catch(this.handleError);



    getVodCategories()
        let url="http://CategoryList";
        let headers = new Headers( 'Content-Type':     'application/json','Accept':'application/json, text/plain, */*');
        let body = 
                offset: 0,
                count: -1,
                type: 'dfasd',
                categoryid: -1,
             ;
        let options = new RequestOptions(
             headers: headers,
             url:url,
             withCredentials: true,
             timeout:30000,
             body:body
         );
         return this._http.post(url,body,options);
     

     getCategoriesCatolog(cateogoryId,options)
         var url="http://VodList";
         let headers = new Headers( 'Content-Type':    'application/json','Accept':'application/json, text/plain, */*' );
         let body = 
                  count: 100,
                  offset: 0,
                  orderType: 0,
                  categoryid: cateogoryId,
            ;
            options = new RequestOptions(
             url:url,
             withCredentials: true,
             timeout:30000,
             body:body
         );
        return this._http.post(url,body,options);
    

在服务中,getVodCategories() 和 getCategoriesCatolog() 返回 observable 结果,但是当我们尝试在组件中订阅它时,整个数据未定义,之后 Observable.forkjoin() 正在运行。

【问题讨论】:

【参考方案1】:

尽量避免嵌套的 observable ,像下面这样使用 merge insteda

Rx.Observable.merge(
  myService.upload('upload1'),
  myService.upload('upload2')
.take(2)
.subscribe(complete: () =>  ... );

【讨论】:

问题是 result.categorylist.forEach((catergory) => cats.push(catergory.name); Observers.push(this.getCategoriesCatolog(catergory.id,)); ); 问题是 result.categorylist.forEach((catergory) => cats.push(catergory.name); Observers.push(this.getCategoriesCatolog(catergory.id,)); );当我们调用 getCategoriesCatalog 时,它会删除来自 catelogylist 的 cat id 参数,Observable 数组来,并且 Observables 包含我们必须在组件数据中返回的不同响应。但是使用合并后我无法订阅所需的结果。第一个调用结果应该用在第二个调用参数中。这是问题请回复 从服务中返回承诺并在组件中捕获它。在服务中,您可以订阅所有内容。

以上是关于函数返回后 Observable.forkJoin 调用延迟的主要内容,如果未能解决你的问题,请参考以下文章

Rxjs:Observable.combineLatest vs Observable.forkJoin

Observable.forkJoin() 不执行

Observable forkJoin 从不执行管道

如何在RXJS 6.3.3中使用ForkJoin导入Observer?

ForkJoin 2 BehaviorSubjects

显示错误并恢复流