programing

동작 주체 초기값이 null입니까?

bestprogram 2023. 8. 20. 12:18

동작 주체 초기값이 null입니까?

private customer: Subject<Object> = new BehaviorSubject<Object>(null);

setCustomer(id, accountClassCode) {
    this.customer.next({'id': id, 'accountClassCode': accountClassCode});
}

getCustomer() {
    return this.customer.asObservable();
}

코드의 이 부분을 사용하고 있는데 ID null을 찾을 수 없는 오류가 발생합니다.null이 아닌 초기 값을 얻을 수 있는 솔루션이 있습니까?

의 목적BehaviorSubject초기 값을 제공하는 것입니다.그럴 수 있다.null아니면 다른 것들.유효한 초기 값을 제공할 수 없는 경우(사용자 ID를 아직 알 수 없는 경우)에는 사용할 수 없습니다.

ReplaySubject(1)유사한 동작(구독 시 마지막 값 포함)을 제공하지만 을(를) 사용하여 설정할 때까지 초기 값을 가지지 않습니다.next.

아마 그래야 할 것 같습니다.

private customer: Subject<Object> = new ReplaySubject<Object>(1);

다음과 같은 방식으로 서비스를 구성해 보십시오.

서비스:

@Injectable()
export class MyService {
    customerUpdate$: Observable<any>;

    private customerUpdateSubject = new Subject<any>();

    constructor() {
        this.customerUpdate$ = this.customerUpdateSubject.asObservable();
    }

    updatedCustomer(dataAsParams) {
        this.customerUpdateSubject.next(dataAsParams);
    }
}

추가하는 것을 기억하십시오.MyService제공자에게.

클라이언트를 업데이트하는 경우(이 경우) 다음과 같은 작업을 수행합니다.

구성 요소(트리거하는 구성 요소):

constructor(private myService: MyService) {
        // I'll put this here, it could go anywhere in the component actually
        // We make things happen, Client has been updated
        // We store client's data in an object
        this.updatedClient = this.myObjectWithUpdatedClientData;  // Obj or whatever you want to pass as a parameter
        this.myService.updatedCustomer(this.updatedClient);
    }

구성요소(구독된 구성요소):

this.myService.customerUpdate$.subscribe((updatedClientData) => {
            // Wow! I received the updated client's data
            // Do stuff with this data!
        }
    );

제가 알기로는 당신은 한 구성 요소에서 다른 구성 요소로 데이터를 전달하려고 하는 것으로 알고 있습니다.고객의 데이터를 가져와 앱을 통해 다른 구성 요소로 전송하는 것이죠?그것이 제가 이 솔루션을 게시한 이유입니다.

다른 유형의 구독에 관심이 있는 경우 다음을 읽어 보십시오.

Angular 2 특수 관측 개체(제목/행동 제목/대상 재생)

개체가 null일 수 있으므로 다음과 같이 유형을 추론하는 것이 좋습니다.

 private customer = new BehaviorSubject<Customer|null>(null);

단순성을 원하는 많은 사례를 발견했습니다.ReplaySubject(1)하지만 또한 그것을 원합니다.value의 재산.BehaviorSubject즉, 구독할 필요 없이 검색을 위해 가장 최근의 값을 저장합니다.그리고 사용하기BehaviorSubject방송되는 초기 값의 필요성을 고려할 때, 제가 거의 원하지 않았던 조건은 항상 짜증났습니다.그 목적을 위해 나는 나만의 것을 만들었습니다.CurrentSubject.

import { ReplaySubject } from "rxjs";

export class CurrentSubject<T> extends ReplaySubject<T> {
    value: T;

    set(value?: T) {
        this.value = value;
        this.next(value);
    }
}

나는 그것을 무시하고 싶었습니다.next방법이지만 나는 어떤 이유로 그것을 작동시킬 수 없어서, 나는라는 방법을 결정했습니다.set내 오버라이드 시도는 이렇게 보였는데...

export class CurrentSubject<T> extends ReplaySubject<T> {
    value: T;

    next(value?: T) {
        this.value = value;
        super.next(value);
    }
}

왜 오버라이드가 효과가 없었는지 모르겠어요.

또 다른 방법은 파이프를 사용하여 null이 아닌 값이 수신될 때까지 필터링하는 것입니다.테이크로 할 수 있습니다.동시에.

.pipe(filter(val => !!val)).subscribe(x => {});

언급URL : https://stackoverflow.com/questions/44693438/behaviour-subject-initial-value-null