Angular 如何链接这些方法?

Angular 如何链接这些方法?,angular,rxjs,Angular,Rxjs,我已经创建了一个服务方法,可以在其中检查给定的公司ID是否已经存在于我的数据库中。。。此方法很简单,可以返回true或false: public checkIfOndernemingsnummerAlreadyExists(ondernemingsnummer: string): Observable<boolean> { const url = `${environment.apiUrl}/ondernemingen/exists/${onderneming

我已经创建了一个服务方法,可以在其中检查给定的公司ID是否已经存在于我的数据库中。。。此方法很简单,可以返回true或false:

    public checkIfOndernemingsnummerAlreadyExists(ondernemingsnummer: string): Observable<boolean> {
        const url = `${environment.apiUrl}/ondernemingen/exists/${ondernemingsnummer}`;
        return this.http.get<boolean>(url);
    }
但这给了我以下错误:

您在需要流的位置提供了“未定义”。您可以提供一个可观察的、承诺的、数组的或可观察的

现在我想这是因为在第二个switchMap中,我只在isDuplicate不为真时返回一个值。在另一种情况下,我不退还任何东西

我的requestService.SelectOnDerning如下所示:

    public selectOnderneming(onderneming: OndernemingDetail): Observable<RequestSteps> {
        this.store.dispatch(new SetOndernemingOfRequest(onderneming));
        return this.gotoNextStep();
    }
那么,当isDuplicate为真时,应该在switchMap中写入什么呢? 或者我应该完全重新排列我的代码

我想要实现的是:

将loading属性设置为true 调用kandidatuurService.CheckiFonderMingSnummeralReadyExists 基于此结果集,isDuplicate属性 当它不是重复的呼叫请求服务时。选择OnDerneming 全部完成后,将加载属性设置为false
不需要两个开关映射,反应历史从第一个请求开始,您可以将其作为链的开始。过滤掉重复的响应,然后切换映射,应该就是这样

编辑:如下所述,当返回false时,筛选器应注意加载标志,因为没有其他人有此机会

this.loading = true;

this.kandidatuurService.checkIfOndernemingsnummerAlreadyExists(this.onderneming.ondernemingsnummer)
    .pipe(
        filter(
            //... logic checking for duplicates here
        ),
        switchMap(() => this.requestService.selectOnderneming(this.onderneming))
    )
    .subscribe( // subscribers here

好的,我实施了以下建议:

    this.loading = true;

    this.kandidatuurService.checkIfOndernemingsnummerAlreadyExists(this.onderneming.ondernemingsnummer)
      .pipe(
        tap((isDuplicate) => this.isDuplicate = isDuplicate),
        filter(x => x !== true),
        switchMap(() => this.requestService.selectOnderneming(this.onderneming))
      ).subscribe(v => { this.loading = false; this.ref.detectChanges(); });

但是现在当它是一个副本时,最终订阅没有被执行。。。这不是我真正想要的

也许有更好的解决方案,但对于一个有望工作的版本:

this.loading = true;
this.kandidatuurService.checkIfOndernemingsnummerAlreadyExists(this.onderneming.ondernemingsnummer)
 .pipe(tap((isDuplicate) => this.isDuplicate = isDuplicate),
       switchMap((isDuplicate) => (isDuplicate ? of(true) : this.requestService.selectOnderneming(this.onderneming))))
 .subscribe(v => { this.loading = false; this.ref.detectChanges(); });

我猜他也必须执行subscribe部分,在重复的情况下,隐含的checkifondernemingsummeralreadyexists总是只给出一个值duplicate或no duplicate@tompynation:它的行为方式是什么?过滤后,它将被减少到零或一。是的,在零的情况下,订阅不会在加载覆盖中执行,或者什么都不会被禁用,或者我错了?oO@J.你是对的。。。最终订阅应该一直执行,以便加载属性设置为false。好的,当它是一个副本时,预期的行为是什么?为什么要将isDuplicate保存到这个?您可以在这里否定加载标志:tapisDuplicate=>{this.isDuplicate=isDuplicate;this.loading=this.loading&!isDuplicate;}我正在存储isDuplicate,因为我需要它在UIT中。这给了我一个错误:InvalidPipeArgument:“true”对于管道“AsyncPipe”,你是对的,你的代码工作正常。我这边的错误是由this.ref.detectChanges行生成的;在我的UI中有一个div:但是我的UI没有被更新,这就是为什么我使用detectChanges方法。但是现在这个detectChanges引起了麻烦,UI仍然没有更新OK,我明白了。刚换了两份?oftrue:this.requestService.selectOnDerningthis.OnDerningto isDuplicate?请求步骤:this.requestService.selectOndernemingthis.onderneming现在一切正常。谢谢你的帮助!尝试用以下内容来区分您的版本
this.loading = true;
this.kandidatuurService.checkIfOndernemingsnummerAlreadyExists(this.onderneming.ondernemingsnummer)
 .pipe(tap((isDuplicate) => this.isDuplicate = isDuplicate),
       switchMap((isDuplicate) => (isDuplicate ? of(true) : this.requestService.selectOnderneming(this.onderneming))))
 .subscribe(v => { this.loading = false; this.ref.detectChanges(); });