Angular 如果没有Api方法上的第一个,forkJoin将无法工作

Angular 如果没有Api方法上的第一个,forkJoin将无法工作,angular,typescript,observable,fork-join,Angular,Typescript,Observable,Fork Join,我已经编写了如下所示的forkJoin。如果我不首先将api方法设置为,,它将不起作用(也没有错误)。您能告诉我为什么吗 我的ts 服务台 api.ts Api响应如下所示: Forkjoin通过并行订阅所有可观察对象来工作,并且只有当所有可观察对象都完成后,它们才会重新连接。这里的关键字是它们何时完成。 操作符.first()从一个可观察对象中获取第一个发出的元素,然后完成。可能是因为你的源观测没有完成 对于要完成的示例,请在onNext之后添加onComplete行 get(api) {

我已经编写了如下所示的
forkJoin
。如果我不首先将api方法设置为
,它将不起作用(也没有错误)。您能告诉我为什么吗

我的ts

服务台

api.ts

Api响应如下所示:


Forkjoin通过并行订阅所有可观察对象来工作,并且只有当所有可观察对象都完成后,它们才会重新连接。这里的关键字是它们何时完成。 操作符.first()从一个可观察对象中获取第一个发出的元素,然后完成。可能是因为你的源观测没有完成

对于要完成的示例,请在onNext之后添加onComplete行

 get(api) {
    return new Observable(observer => {
        let header = new Headers();
        this.createHeader(header)
            .then(() => {
                let options = new BaseRequestOptions();
                options.withCredentials = true;
                options.headers = header;
                this.http.get(api, options)
                    .subscribe(response => {
                        observer.next(response);
                        // add this line, it should trigger the completion of the outer observable
                        observer.complete();
                    }, (e) => {
                        observer.error(e);
                    });
            })
    })
}

您所说的
是什么意思,可能是因为您的源观测没有完成
?如果是,为什么会发生这种情况?在本文中,您可以看到没有使用
forkjoin
first()
方法?this.api.get调用使用一个承诺来调用next。这很好,但是为了完成,您也必须在onnext之后启动onComplete函数,observable需要完成才能使用forkJoin。通过使用AngularHTTP服务,onComplete调用由服务本身处理,程序员无需调用它。但是通过创建observable,您将负责发出新的值,并最终完成streamExcellent。一个问题:如果我按照您提到的那样实施,那么我是否应该删除此项目中的所有
first(),毕竟,如果您需要的源可观察对象只发出一个值,那么.first()操作符将创建一个新值,该值肯定会完成。请始终记住,给定一个可观测的源,任何运算符链都将创建一个新的,除非您将其引用存储在与源相同的变量中:)
 myTopic() {
 return this.api.get(config.myTopics).map((res: any) => res.json()).first();//without first forkjoin is not working.Why?
 }
 get(api) {
        return new Observable(observer => {
            let header = new Headers();
            this.createHeader(header)
                .then(() => {
                    let options = new BaseRequestOptions();
                    options.withCredentials = true;
                    options.headers = header;
                    this.http.get(api, options)
                        .subscribe(response => {
                            observer.next(response);
                        }, (e) => {
                            observer.error(e);
                        });
                })
        })
    }
{
  "num_of_definitions": 11,
  "categories": [
    {
      "id": 68,
      "name": "Founders",
      "num_of_definitions": 1,
      "icon": {
        "large": ""
      },
      "from_color": "#1E3C72",
      "to_color": "#2A5298"
    },
    {
      "id": 27,
      "name": "Innovation",
      "num_of_definitions": 1,
      "icon": {
        "large": ""
      },
      "from_color": "#EE0979",
      "to_color": "#FF6A00"
    },
    {
      "id": 58,
      "name": "Life success",
      "num_of_definitions": 1,
      "icon": {
        "large": ""
      },
      "from_color": "#D53369",
      "to_color": "#CBAD6D"
    },

  ]
}
 get(api) {
    return new Observable(observer => {
        let header = new Headers();
        this.createHeader(header)
            .then(() => {
                let options = new BaseRequestOptions();
                options.withCredentials = true;
                options.headers = header;
                this.http.get(api, options)
                    .subscribe(response => {
                        observer.next(response);
                        // add this line, it should trigger the completion of the outer observable
                        observer.complete();
                    }, (e) => {
                        observer.error(e);
                    });
            })
    })
}