首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作超过6个forkJoin参数?

工作超过6个forkJoin参数?
EN

Stack Overflow用户
提问于 2018-03-28 19:34:51
回答 5查看 8.7K关注 0票数 10

我需要/希望在forkJoin中使用六个以上的参数。目前,根据对另一个相关问题的答复,向forkJoin发送6个以上的参数似乎是不可能的。

然而,根据官方文档,它说:"forkJoin是一个操作符,可以将任意数量的可观测数据作为数组传递,也可以直接作为参数传递。“

forkJoin -官方文件

好的,我正在这样做,我得到了一个错误to 2322:输入'foo‘不能分配到键入'bar[]’。

在我的研究中,我还发现,如果您有返回不同类型的承诺,最好不要将参数作为数组发送,因为这样会将参数类型转换为所有相同的类型。- 来源

这是我的密码。我使用的是最新版本的打字稿和角4。

代码语言:javascript
复制
ngOnInit() {
    this.spinner.show();
    Observable.forkJoin(
        this.loadParams(),              // Returns an Observable<Object>
        this.service.getPromiseType1(), // The rest return Observable<Array>
        this.service.getPromiseType2(),
        this.service.getPromiseType3(),
        this.service.getPromiseType4(),
        this.service.getPromiseType5(),
        this.service.getPromiseType6(),
    ).finally(() => this.spinner.hide())
        .subscribe(
            ([param, promise1, promise2, promise3, promise4, promise5, promise6]) => {
                this.job = job;
                this.value1 = promise1;
                this.value2 = promise2;
                this.value3 = promise3;
                this.value4 = promise4;
                this.value5 = promise5;
                this.value6 = promise6;
            }, (error) => {errorHandlingFunction}
   });

如果我删除任何单个参数,以便将6个参数传递给forkJoin,它就可以正常工作。所以我的问题是,在我的例子中,我想在一个调用中加载可观察的对象和后续的数组可观测值,还有其他方法吗?这是否是forkJoin的一个bug,因为官方文档说它应该能够接受任意数量的可观测数据?

我尝试在array.forEach()内部创建一个类型可观察的数组,并使用forkJoin (),但它抱怨返回类型为void。不管怎么说,这似乎是一种简陋的做法。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-03-28 20:44:42

正如回答在您所链接的问题中解释的那样,参数的最大数量仅受类型定义--而不是运行时源本身的限制。类型定义很有用,因为它们声明将为可观察流的下一步生成的数组元素类型(在您的示例中是[param, promise1, promise2, ...]的类型)。

听起来,对订阅处理程序中的分配进行严格的类型安全是导致问题的原因。由于您有6个以上的可观测值,因此它将结果参数默认为共享类型,该类型可能与要分配的字段的类型不匹配。

有几种方法可以解决这个问题。您可以在订阅处理程序中转换参数,也可以自己添加自己的类型。转换参数是快速和肮脏的解决方案,但它会导致您失去类型的安全性。自己添加类型将使您维护类型安全性,但这也意味着您将得到任意数量的工厂方法声明。将以下内容放置在项目中的任何地方的类型定义文件(*.d.ts)中。我喜欢将类似这样的类型定义放在typings/目录中,位于兄弟级的app/目录中。

代码语言:javascript
复制
import { Observable, SubscribableOrPromise } from 'rxjs/Observable';

declare module 'rxjs/observable/ForkJoinObservable' {
    namespace ForkJoinObservable {
        export function create<T, T2, T3, T4, T5, T6, T7>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, v4: SubscribableOrPromise<T4>, v5: SubscribableOrPromise<T5>, v6: SubscribableOrPromise<T6>, v7: SubscribableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;
        export function create<T, T2, T3, T4, T5, T6, T7, R>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, v4: SubscribableOrPromise<T4>, v5: SubscribableOrPromise<T5>, v6: SubscribableOrPromise<T6>, v7: SubscribableOrPromise<T7>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => R): Observable<R>;
    }
}

此过程将在TypeScript文档页面中详细解释声明合并

编辑:看起来我使用的是旧版本的RxJS,从那以后结构发生了一些变化。以下内容应该更接近于应该与当前结构一起工作的类型声明:

代码语言:javascript
复制
declare module 'rxjs/Observable' {
    namespace Observable {
        export function forkJoin<T, T2, T3, T4, T5, T6, T7>(sources: [ObservableInput<T>, ObservableInput<T2>, ObservableInput<T3>, ObservableInput<T4>, ObservableInput<T5>, ObservableInput<T6>, ObservableInput<T7>]): Observable<[T, T2, T3, T4, T5, T6, T7]>;
        export function forkJoin<T, T2, T3, T4, T5, T6, T7>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, v7: ObservableInput<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;
    }
}

我是以当前forkJoin类型声明为基础的。

就模块增强而言,上面的代码修改由绝对路径'rxjs/Observable'定义的模块的类型声明。这与导入Observable类时使用的导入路径相同。RxJS定义的模块导出Observable类及其字段。我们对该模块的增强通过使用namespace块来修改它。这允许我们在Observable命名空间下添加类型声明(例如,用于Observable.myFunctionOrField的类型声明),它看起来与调用静态函数相同。实际上,这声明了额外的Observable.forkJoin函数的可能性。

票数 7
EN

Stack Overflow用户

发布于 2019-12-17 16:10:45

从rxJs的6.5版开始,您可以使用值字典将任意数量的可观测值放入forkJoin 参见这里的第一个示例

代码语言:javascript
复制
    forkJoin({first: of(1), second: of(2), third: of(3)})
             .subscribe(result => {console.log(result.first)});
票数 6
EN

Stack Overflow用户

发布于 2018-10-16 04:21:01

谢谢@MikeHill让我指出正确的方向。最终为我工作的解决方案是向角-cli生成的src文件夹中添加一个typings.d.ts。我相信您也可以在同一位置使用键入文件夹,但是您需要更新您的tsconfig.app.json文件,有关更多信息,请参阅本文。https://github.com/angular/angular-cli/blob/6449a753641340d8fc19a752e1a1ced75f974efa/docs/documentation/1-x/stories/third-party-lib.md

带有typings.d.ts的7个参数的forkJoin

代码语言:javascript
复制
import { ObservableInput, Observable } from 'rxjs';
import { forkJoin } from 'rxjs/internal/observable/forkJoin';

declare module 'rxjs/internal/observable/forkJoin' {
  export function forkJoin<T, T2, T3, T4, T5, T6, T7>(
    sources: [
      ObservableInput<T>,
      ObservableInput<T2>,
      ObservableInput<T3>,
      ObservableInput<T4>,
      ObservableInput<T5>,
      ObservableInput<T6>,
      ObservableInput<T7>
    ],
  ): Observable<[T, T2, T3, T4, T5, T6, T7]>;
  export function forkJoin<T, T2, T3, T4, T5, T6, T7>(
    v1: ObservableInput<T>,
    v2: ObservableInput<T2>,
    v3: ObservableInput<T3>,
    v4: ObservableInput<T4>,
    v5: ObservableInput<T5>,
    v6: ObservableInput<T6>,
    v7: ObservableInput<T7>,
  ): Observable<[T, T2, T3, T4, T5, T6, T7]>;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49542770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档