Rxjs forkJoin don';t触发器响应
我有以下代码:Rxjs forkJoin don';t触发器响应,rxjs,observable,Rxjs,Observable,我有以下代码: let extension = this._http.Get('/settings/get_kv/credentials', {credential_key : "extensions"}) let urlRef = this._http.Get('/settings/get_kv/credentials', {credential_key : "urlRef"}) let product = this._http.Get('/settings/get_k
let extension = this._http.Get('/settings/get_kv/credentials', {credential_key : "extensions"})
let urlRef = this._http.Get('/settings/get_kv/credentials', {credential_key : "urlRef"})
let product = this._http.Get('/settings/get_kv/credentials', {credential_key : "product"})
let messageBackend = this._http.Get('/settings/get_kv/credentials', {credential_key : "messageBackend"})
Observable.forkJoin([extension, urlRef, product, messageBackend]).subscribe((results:any) => {
let apikvConfig = {...results[0], ...results[1], ...results[2], ...results[3]};
});
我的方法是这样的:
public Get<T>(url, payload): Observable<T> {
let additionalParam = "";
if(payload) {
additionalParam = "?";
for (var key in payload) {
if(additionalParam != "?") additionalParam += "&"
additionalParam += key+"="+payload[key];
}
}
let onGetCompleted = new Subject<any>();
let onGetCompleted$ : Observable<any> = onGetCompleted.asObservable();
this.http.get<T>(url+additionalParam, httpHeaders)
.pipe(
retry(MAX_RETRY)
// TODO add error handler - JP
// catchError()
).subscribe((data) => {
onGetCompleted.next(data);
onGetCompleted.unsubscribe();
})
return onGetCompleted$;
}
public-Get(url,有效负载):可观察{
设additionalParam=“”;
if(有效载荷){
additionalParam=“?”;
用于(var密钥输入有效负载){
如果(additionalParam!=“?”)additionalParam+=“&”
附加参数+=键+“=”+有效载荷[键];
}
}
让onGetCompleted=新主题();
让onGetCompleted$:Observable=onGetCompleted.asObservable();
this.http.get(url+additionalParam,httpHeaders)
.烟斗(
重试(最大重试次数)
//TODO添加错误处理程序-JP
//catchError()
).订阅((数据)=>{
onGetCompleted.next(数据);
onGetCompleted.unsubscribe();
})
报税表(港币);;
}
但是forkJoin从未进入subscribtion
我尝试合并,也尝试concat,但它们返回我的可观察结果,而不是结果
我做错了什么
编辑:
我做到了:
Load(): Observable<any>{
let extension = this._http.Get('/settings/get_kv/credentials', {credential_key : "extensions"})
let urlRef = this._http.Get('/settings/get_kv/credentials', {credential_key : "urlRef"})
let product = this._http.Get('/settings/get_kv/credentials', {credential_key : "product"})
let messageBackend = this._http.Get('/settings/get_kv/credentials', {credential_key : "messageBackend"})
extension.subscribe((res) => { console.log(res)});
urlRef.subscribe((res) => { console.log(res)});
product.subscribe((res) => { console.log(res)});
messageBackend.subscribe((res) => { console.log(res)});
let obs = Observable.forkJoin([extension, urlRef, product, messageBackend])
obs.subscribe((results:any) => {
let apikvConfig = {...results[0], ...results[1], ...results[2], ...results[3]};
console.log(apikvConfig);
return;
this._storeApp.dispatch(new StoreUseraction.SetExtensionsValue(apikvConfig));
});
return obs;
}
Load():可观察{
让extension=this.\u http.Get('/settings/Get\u kv/credentials',{credential\u key:“extensions”})
让urlRef=this.\u http.Get('/settings/Get\u kv/credentials',{credential\u key:“urlRef”})
让product=this.\u http.Get('/settings/Get\u kv/credentials',{credential\u key:“product”})
让messageBackend=this.\u http.Get('/settings/Get\u kv/credentials',{credential\u key:“messageBackend”})
subscribe((res)=>{console.log(res)});
urlRef.subscribe((res)=>{console.log(res)});
product.subscribe((res)=>{console.log(res)});
messageBackend.subscribe((res)=>{console.log(res)});
让obs=Observable.forkJoin([extension,urlRef,product,messageBackend])
obs.subscribe((结果:任意)=>{
设apikvConfig={…结果[0],…结果[1],…结果[2],…结果[3]};
log(apikvConfig);
返回;
这个.u storeApp.dispatch(newstoreuseraction.SetExtensionsValue(apikvConfig));
});
返回obs;
}
每个日志都会返回一个值首先是一个前言,为了未来读者的利益(不是专门针对您的,因为我经常看到这一点): 90%的时间你不需要主题 事实上,这可能接近99%的时间,因为其他9%将留给编写集成库的人。RxJS的大多数最终用户不需要常规代码中的
主题
现在,你的具体问题已经解决了
跳到底部以获得快速答案:)
您的Get
方法正在尝试重新发明轮子,它将一个bug引入到您的预期行为中
let onGetCompleted = new Subject<any>();
let onGetCompleted$ : Observable<any> = onGetCompleted.asObservable();
this.http.get<T>(url+additionalParam, httpHeaders)
.pipe(
retry(MAX_RETRY)
// TODO add error handler - JP
// catchError()
).subscribe((data) => {
// *** Here is the problem ***
onGetCompleted.next(data);
onGetCompleted.unsubscribe();
})
return onGetCompleted$;
现在,当您使用它时,它的行为应该符合预期。这里需要注意的一点是,在当前的实现中,您似乎试图模拟“仅一次”的行为。如果需要保留该行为,可以通过使用操作符来实现。例如,如果我有两个地方需要相同呼叫的结果,我可以:
const onNext = (loc) => () => console.log(`At ${loc}`);
const source$ = this._http.Get(url, payload).pipe(
tap(onNext('pipe')),
publishLast() // This returns a ConnectableObservable
);
// Sets up both subscriptions
source$.subscribe(onNext('first subscriber'));
source$.subscribe(onNext('second subscriber'));
// Executes the GET call by connecting the underlying subscriber to the source
source$.connect();
// Console
// At pipe
// At first subscriber
// At second subscriber
虽然这看起来像是初始化代码,但在启动时应用程序只会调用一次,所以即使是这一步也可能没有必要。
forkJoin
要求所有源观测值至少发出一个值并完成。否则它不会发出任何信息。@martin check edit plsTip:检查删除这些console.log订阅时会发生什么。你会对发生的事情感到惊讶;)另外,请阅读这篇文章:当我删除它们时,事实上什么都没有发生@Davythank你给出了非常明确的答案,是的,我真的认为我没有完全理解主体和观察对象。我将阅读你在这些回复中传递给我的所有链接。再次感谢您的修复和解释
const onNext = (loc) => () => console.log(`At ${loc}`);
const source$ = this._http.Get(url, payload).pipe(
tap(onNext('pipe')),
publishLast() // This returns a ConnectableObservable
);
// Sets up both subscriptions
source$.subscribe(onNext('first subscriber'));
source$.subscribe(onNext('second subscriber'));
// Executes the GET call by connecting the underlying subscriber to the source
source$.connect();
// Console
// At pipe
// At first subscriber
// At second subscriber