RxJ awaiting_response
에서 사용하여 변수 (아래)를 true (설정되지 않음)로 설정하는 데 어려움이있었습니다 tap()
.
해키 솔루션은 외부 설정으로 만들어 pipe()
졌지만 이상적이지 않은 것 같습니다.
동일한 코드를 볼 수 있습니다 여기에
여기 있습니다 component.ts
import { Component, OnInit } from "@angular/core";
import { Observable, Subject, of } from "rxjs";
import { debounceTime, distinctUntilChanged, tap, switchMap, catchError, finalize } from "rxjs/operators";
import { ServiceApiService, ITemp } from "./service-api.service";
@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"]
})
export class AppComponent implements OnInit {
protected addresses: Observable<ITemp[]>;
private search_term: Subject<string> = new Subject<string>();
protected executing_search: boolean = false;
protected awaiting_response: boolean = false;
constructor(private search: ServiceApiService) {}
ngOnInit() {
this.addresses = this.search_term.pipe(
debounceTime(3500),
distinctUntilChanged(),
tap(() => (this.awaiting_response = true)),
tap(() => () => console.log("awaiting", this.awaiting_response)),
switchMap((term: string) =>
this.search.search_addresses(term).pipe(
catchError(() => of<ITemp[]>([]))
//finalize(() => setTimeout(() => (this.awaiting_response = false), 0))
)
),
tap(() => (this.awaiting_response = false)),
tap(() => console.log("awaiting", this.awaiting_response)),
tap(() => (this.executing_search = false))
//finalize(() => (this.awaiting_response = false))
);
}
execute_search() {
this.executing_search = true;
this.search_term.next("term");
}
}
그만큼 service
import { Injectable } from "@angular/core";
import { Observable, Subscriber } from "rxjs";
export interface ITemp {
value: string;
}
@Injectable({
providedIn: 'root',
})
export class ServiceApiService {
constructor() {}
search_addresses(term: string): Observable<ITemp[]> {
return Observable.create((observer: Subscriber<any>) => {
observer.next([{ value: `response: ${new Date().toString()}` }]);
observer.complete();
});
}
}
그리고 component.html
<button (click)="execute_search()">Search</button>
<div>Awaiting: {{awaiting_response | json}}</div>
<div>Executing {{executing_search | json}}</div>
<div>Response: {{addresses | async | json}}
짧은 대답은 코드가 예상대로 작동해야한다는 것입니다.
여기에 설명이 있습니다. 귀하 awaiting_response
는 true로 설정되어 있지만 observer
서비스의 값이 즉시 방출 되므로 차이를 볼 수 없습니다.
timeout
다음과 같이 서비스에서 설정 한 차이점을 보여주기 위해 ,
search_addresses(term: string): Observable<ITemp[]> {
return Observable
.create((observer: Subscriber<any>) => {
setTimeout(() => {
observer.next([{ value: `response: ${new Date().toString()}` }]);
observer.complete();
}, 3000);
});
}
이 stackblitz 의 차이점을 볼 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다