当前位置: 首页 > 知识库问答 >
问题:

Observable.fork连接和数组参数

陶英纵
2023-03-14

在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-如何在继续之前等待循环中的所有函数调用结束?

但是我还没有完全掌握使用数组和正确的语法来正确使用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个答案

景鸿才
2023-03-14

这里是一个使用Angular 12的工作演示。语法与公认的答案有很大的不同(不再可见):

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

注意:打开Developer Tools控制台,查看我正在做的事情的输出

首先,这将获取一个JSON项数组(在本例中是一个用户数组),并使用map方法将它们转换为单独的HTTP补丁调用。

  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
      );
    });
  }

现在这是一组可观测的数据forkJoin作为包装器添加,以便进行这些调用

return forkJoin(mappedCalls);

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

注意:如果forkJoin中有一个调用失败,那么它们都将失败。

阎承
2023-03-14

您需要导入默认情况下未加载的运算符。这就是EXCEPTION Observable.xxxx不是函数通常的意思。您可以通过向引导程序添加完整的rxjs来导入所有运算符,例如:

import 'rxjs/Rx'

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

import 'rxjs/add/observable/forkJoin'

关于你的代码的另一个观察/建议:试着坚持一种语法。你在混合es5,es6,打字稿...当它工作的时候,从长远来看只会让你困惑。此外,如果您刚刚开始使用可观察性,请尝试避免使用新的可观察性(),而是使用创建运算符;

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的文档仍然不完整,但您可以在许多源文件中找到描述。

 类似资料:
  • 问题内容: 在我的node.js / Express.js应用程序中,我需要通过socket.io连接传递参数(请参见另一篇文章)。 在客户端,我有类似的东西: 编辑 在服务器端: 编辑 但是控制台中什么也没有。 还有另一种方法可以实现吗? 编辑2 这是客户端的完整代码: 以及服务器端的完整代码: 具有功能: 感谢你的帮助 问题答案: 就在这里。 1)就像参数一样,因此请替换为(如果您想传递多个参

  • 问题 你希望将两个数组连接到一起。 解决方案 在 JavaScript 中,有两个标准方法可以用来连接数组。 第一种是使用 JavaScript 的数组方法 concat(): array1 = [1, 2, 3] array2 = [4, 5, 6] array3 = array1.concat array2 # => [1, 2, 3, 4, 5, 6] 需要指出的是 array1 没有被运算

  • 问题内容: 我正在使用Postgres 9.3。 我有两个表 以及它们之间的关系。现在,我想创建一个视图,该视图除了T1的列外,还为T1中的每个记录提供一列,其中包含一个包含T2所有相关记录的主键ID的数组。如果T2中没有相关条目,则此列的相应字段应包含空值。 我的架构的抽象版本如下所示: 可以如下生成相应的样本数据: 到目前为止,我提出了以下查询: 这行得通。但是,可以简化吗? 可以在此处找到相

  • 函数名称:连接数组 函数功能:连接数组 函数方法 str = table.concat (tb,sep,i, j) 参数 类型 必填 说明 tb table 是 待操作数组 sep string 是 分割的字符 i number 否 tb[i] 起点,默认值: 1 j number 否 tb[j] 终点,,默认值: #tb 返回值 类型 说明 str string 连接后的字符串 函数示例 tb

  • 问题内容: 我正在尝试连接4个数组,一个1D形状的数组(78427,)和3个2D形状的数组(78427,375/81/103)。基本上,这是4个数组,具有78427个图像的特征,其中1D数组每个图像仅具有1个值。 我尝试串联数组,如下所示: 这将导致以下错误: 追溯(最近一次调用):文件“”,第1行,在ValueError中:所有输入数组的维数必须相同 问题似乎是一维数组,但是我真的看不出来为什么

  • 当我添加一个左连接来获取外部表的计数时,它将我其他左连接表的总和值与计数相乘,我也不能在这里使用不同的总和,因为两个值可以是相同的: