Observable.forkJoin和数组参数

时间:2016-02-27 22:50:46

标签: angular observable fork-join

在Observables forkJoin文档中,它说args可以是一个数组,但它没有列出这样做的例子:

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md

我尝试了类似于我列出的功能(如下所示),但却出现了错误:

:3000/angular2/src/platform/browser/browser_adapter.js:76 

EXCEPTION: TypeError: Observable_1.Observable.forkJoin is not a function

我的功能的剪切版本如下:

processStuff( inputObject ) {
  let _self = this;

  return new Observable(function(observer) {
    let observableBatch = [];

    inputObject.forEach(function(componentarray, key) {
      observableBatch.push(_self.http.get(key + '.json').map((res: Response) => res.json()));
    });

    Observable.forkJoin(
      observableBatch
    // );
    ).subscribe(() => {
      observer.next();
      observer.complete();
    });

  });
}

我的问题的根源与循环结束有关,然后按照此处的要求继续:Angular2 Observable - how to wait for all function calls in a loop to end before proceeding?

但我还没有完全掌握forkJoin与数组的正确用法以及正确的语法。

我非常感谢您提供的帮助。

注意:返回可观察的第三功能的例子

thirdFunction() {
  let _self = this;

  return Observable.create((observer) => {
  // return new Observable(function(observer) {
    ...

    observer.next(responseargs);
    observer.complete();
  });
}

processStuff(inputObject) {
  let _self = this;
  let observableBatch = [];

  inputObject.forEach((componentarray, key) => {
    observableBatch.push(_self.thirdFunction().map((res: Response) => res.json()));
  });

  return Observable.forkJoin(observableBatch);
}

elsewhere() {
  this.processStuff(inputObject)
    .subscribe()
}

2 个答案:

答案 0 :(得分:72)

您需要导入默认情况下未加载的运算符。 EXCEPTION Observable.xxxx is not a function通常意味着什么。您可以通过向引导程序添加完整的rxjs来导入所有运算符,例如:

import 'rxjs/Rx'

或通过导入特定的运算符,在您的情况下:

import 'rxjs/add/observable/forkJoin'

关于您的代码的另一个观察/建议:尝试坚持使用一种语法。你正在混合使用es5,es6,打字稿等......当它正在运行时,它只会让你长期迷惑。另外,如果您刚开始使用Observables,请尝试避免使用new Observable()并使用创建运算符;

processStuff( inputObject ) {
  let observableBatch = [];

  inputObject.forEach(( componentarray, key ) => {
    observableBatch.push( this.http.get( key + '.json').map((res: Response) => res.json()) );
  });

  return Observable.forkJoin(observableBatch);
}

elsewhere() {
  this.processStuff( inputObject )
    .subscribe()
}

最后,请参阅正确的文档 - Angular2使用RxJS v5,您提供的链接用于RxJS v4。对于v5,文档仍然不完整,但您可以在许多源文件中找到描述。

答案 1 :(得分:1)

这是一个使用 Angular 12 的工作演示。语法与接受的答案有很大不同(No more Observable。):

https://stackblitz.com/edit/angular-map-to-forkjoin?file=src/app/app.component.ts

注意:打开开发者工具控制台查看我正在做的输出

首先,这需要一组 JSON 项(在本例中为一组用户),并使用 map 方法将它们转换为单独的 HTTP Patch 调用。

  private mapCalls(users: any[]): Observable<any>[] {
    return users.map(user => {
      // Each User will be patched to the endpoint
      // None of these calls will be made until forkJoin is used
      return this.http.patch(
        `https://jsonplaceholder.typicode.com/users/${user.id}`,
        user
      );
    });
  }

现在是一个 Observable 数组。 forkJoin 被添加为包装器以便进行这些调用

return forkJoin(mappedCalls);

然后可以订阅最终结果,该结果将输出为具有相同项目数的单个数组。

注意:如果一个调用在 forkJoin 中失败,他们都会失败。