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