관찰 가능한 RXJS 배열에 대한 단순 필터
Angular2로 프로젝트를 시작하는데 개발자들이 Promise 대신 RXJs Observable을 추천하는 것 같습니다.
서버에서 요소(픽) 목록을 검색할 수 있습니다.하지만 예를 들어 id를 사용하여 요소를 어떻게 필터링할 수 있습니까?
다음 코드는 제 앱에서 추출한 것으로 현재 최종 작동 솔루션을 보여줍니다.그것이 누군가에게 도움이 되기를 바랍니다.
@Injectable()
export class EpicService {
private url = CONFIG.SERVER + '/app/'; // URL to web API
constructor(private http:Http) {}
private extractData(res:Response) {
let body = res.json();
return body;
}
getEpics():Observable<Epic[]> {
return this.http.get(this.url + "getEpics")
.map(this.extractData)
.catch(this.handleError);
}
getEpic(id:string): Observable<Epic> {
return this.getEpics()
.map(epics => epics.filter(epic => epic.id === id)[0]);
}
}
export class EpicComponent {
errorMessage:string;
epics:Epic[];
epic:Epic;
constructor(
private requirementService:EpicService) {
}
getEpics() {
this.requirementService.getEpics()
.subscribe(
epics => this.epics = epics,
error => this.errorMessage = <any>error);
}
// actually this should be eventually in another component
getEpic(id:string) {
this.requirementService.getEpic(id)
.subscribe(
epic => this.epic = epic,
error => this.errorMessage = <any>error);
}
}
export class Epic {
id: string;
name: string;
}
당신의 도움에 미리 감사드립니다.
관찰 가능한 배열이 아닌 실제 배열을 필터링할 수 있습니다.따라서 관찰 가능한 내용을 매핑합니다(즉,Epic[]
) 필터링된 상태로Epic
.
getEpic(id: string): Observable<Epic> {
return this.getEpics()
.map(epics => epics.filter(epic => epic.id === id)[0]);
}
그 후에 당신은 할 수 있습니다.subscribe
로.getEpic
당신이 원하는 것은 무엇이든 할 수 있습니다.
다음을 사용하여 이 작업을 수행할 수 있습니다.flatMap
그리고.filter
의 방법.Observable
의 JS 배열 필터 방법 대신map
다음과 같은 것:
this.getEpics()
.flatMap((data) => data.epics) // [{id: 1}, {id: 4}, {id: 3}, ..., {id: N}]
.filter((epic) => epic.id === id) // checks {id: 1}, then {id: 2}, etc
.subscribe((result) => ...); // do something epic!!!
flatMap
필터링을 위한 단일 인덱스를 제공하여 다음에 발생하는 결과에 대해 계속 진행할 수 있습니다.
TypeScript가 사용자의 사용에 관계없이 문자열과 숫자를 비교할 수 없음을 나타내는 오류를 발생시키는 경우==
필터에 a를 추가합니다.+
전에epic.id
필터에서 Angular docs에 따라:
.flatMap(...)
.filter((epic) => +epic.id === id) // checks {id: 1}, then {id: 2}, etc
.subscribe(...)
예:
https://stackblitz.com/edit/angular-9ehje5?file=src%2Fapp%2Fapp.component.ts
수정 사항이 있는 원래 답변:Observables
게으르다, 게으르다, 게으르다, 게으르다, 게으르다, 게으르다,전화해야 합니다.subscribe
에 대해 말하자면observable
요청을 전송합니다.
getEpic(id:number) {
return this.getEpics()
.filter(epic => epic.id === id)
.subscribe(x=>...);
}
Rxjs 6으로 업데이트:
import {filter} from 'rxjs/operators';
getEpic(id:number) {
return this.getEpics()
.pipe(filter(epic => epic.id === id))
.subscribe(x=>...);
}
구독해야 합니다.Observable
http 호출은 JavaScript에서 비동기이므로 데이터를 가져옵니다.
getEpic(id: number, callback: (epic: Epic) => void) {
this.getEpics().subscribe(
epics: Array<Epic> => {
let epic: Epic = epics.filter(epic => epic.id === id)[0];
callback(epic);
}
);
}
이 메서드를 다음과 같이 호출할 수 있습니다.
this.someService.getEpic(epicId, (epic: Epic) => {
// do something with it
});
사용하려는 모든 사용자에게flatMap
현재는 더 이상 사용되지 않으며 rxJs는 사용을 권장합니다.mergeMap
대신.
언급URL : https://stackoverflow.com/questions/37991713/simple-filter-on-array-of-rxjs-observable
'programing' 카테고리의 다른 글
어떻게 하면 제 프로젝트를 깃허브에서 끌어낼 수 있을까요? (0) | 2023.08.11 |
---|---|
jquery를 사용하여 입력 필드의 특수 문자를 차단하거나 제한하려면 어떻게 해야 합니까? (0) | 2023.08.11 |
십진수 열에 돈을 저장하는 것 - 어떤 정밀도와 규모입니까? (0) | 2023.08.11 |
선형 레이아웃 하위 항목 사이에 공백을 만드는 방법은 무엇입니까? (0) | 2023.08.11 |
PreferenceManager getDefaultSharedPreferences는 Android Q에서 더 이상 사용되지 않습니다. (0) | 2023.08.11 |