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