【问题标题】:Conditional Observable.forkJoin() building条件 Observable.forkJoin() 构建
【发布时间】:2017-06-08 07:29:19
【问题描述】:

根据函数的参数我要构建forkJoin()方法。

例如:

  • 如果 parameter1 为空 => 不要在 forkJoin()
  • 如果参数 2 为空 => 不要为它发出 http 请求 在 forkJoin() 中

代码:

getAllByIds(parameter1: any, parameter2: any) {

    let itemList = new Array();

    return Observable.forkJoin(
         this.http.get('rest/fillin/ids/' + parameter1) // don't put this request for parameter1 if it is empty
         .map((res: Response) => res.json()),

         this.http.get('rest/textitem/ids/' + parameter2) // don't put this request for parameter2 if it is empty
         .map((res:Response) => res.json())
    ).map(
        data => {
            itemList.push(data[0]);
            itemList.push(data[1]);
            return itemList;
         }
     );
}

那么,是否可以像这样构建 forkJoin()?

【问题讨论】:

    标签: angular rxjs rxjs5 reactivex


    【解决方案1】:

    实际上,这取决于您在跳过一些 HTTP 请求时期望得到什么。

    forkJoin() 的输出应该包含 null 值还是完全忽略它?

    function mockHTTPRequest(id) {
      return Observable.of(id).delay(100);
    }
    
    let parameter1 = 'a';
    let parameter2 = false;
    
    let sources = [];
    if (parameter1) {
      sources.push(mockHTTPRequest('rest/fillin/ids/' + parameter1));
    }
    if (parameter2) {
      sources.push(mockHTTPRequest('rest/textitem/ids/' + parameter2));
    }
    
    Observable.forkJoin(...sources)
      .map(data => {
        console.log(data.length);
        return data;
      })
      .subscribe(values => console.log(values));
    

    观看现场演示:https://jsbin.com/qorulel/5/edit?js,console

    如果parameter1parameter2 为假,此解决方案不会创建源Observables。请注意,console.log(data.length) 可以从 02,具体取决于 parameterX 值。

    或者您可以只创建 Observable.of(null) 而不是 HTTP 请求。

    function mockHTTPRequest(id) {
      return Observable.of(id).delay(100);
    }
    
    let parameter1 = 'a';
    let parameter2 = false; 
    
    let sources = [
      parameter1 ? mockHTTPRequest('rest/fillin/ids/' + parameter1) : Observable.of(null),
      parameter2 ? mockHTTPRequest('rest/textitem/ids/' + parameter2) : Observable.of(null)
    ];
    
    Observable.forkJoin(...sources)
      .map(data => {
        console.log(data.length);
        return data;
      })
      .subscribe(values => console.log(values));
    

    观看现场演示:https://jsbin.com/caheno/5/edit?js,console

    现在输出总是有 2 个值。只是其中一些是null

    【讨论】:

    • 我使用第一个解决方案。它工作正常,但是当sources 数组不包含任何元素时,我会收到EXCEPTION: _b is undefined 错误。是不是因为我没有对sources数组做空检查?
    • 一个空的源数组应该不是问题。这实际上是一个有效的用例,并且经过了github.com/ReactiveX/rxjs/blob/master/spec/observables/… 的测试。你能做一个jsbin重现这个问题吗?
    • 我现在确定它与空请求数组无关。我去其他地方看看。非常有用的评论;)
    • 如何为该源数组添加一个 post http 请求。
    猜你喜欢
    • 2017-06-07
    • 2017-03-11
    • 2017-07-09
    • 2022-01-03
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2017-09-01
    相关资源
    最近更新 更多