답변:
당신이 필요로하는 일에 대해 확실하지 100 % 당신이 첫 번째 값을 관찰하려면,하지만, 다음 중 하나를 사용 first()
하거나 take(1)
:
observable.first().subscribe(func);
참고 : .take(1)
및 .first()
모두 탈퇴가 자동으로 조건이 충족 될 때
Coderer의 코멘트에서 .
import { first } from 'rxjs/operators'
observable
.pipe(first())
.subscribe(func);
observable.pipe(first()).subscribe(func)
곳 first
에서 온다 rxjs/operators
.
RxJS에는 내가 본 최고의 문서 중 일부가 있습니다. 벨로우즈 링크를 따라 가면 사용자에게 매우 유용한 테이블 매핑 사용 사례로 이동합니다. 예를 들어, 아래의 유스 케이스 "나는 첫 번째 값을 원하는 것은"세 사업자는 다음과 같습니다 first
, firstOrDefault
그리고 sample
.
관찰 가능한 시퀀스가 통지없이 완료되면 운영자는 first
가입자에게 오류를 알리는 반면 firstOrDefault
운영자는 가입자에게 기본값을 제공합니다.
Observable을 한 번만 호출하려면 스트림을 기다리지 않을 것입니다. 따라서 구독 취소가 필요하지 않으므로 toPromise()
대신 대신 사용 subscribe()
하면 충분합니다 toPromise()
.
await
promise
보충 브랜든의 대답 @ , 사용 first()
또는 같은이 업데이트를 위해 필수적입니다 BehaviorSubject
그 기반으로 Observable
. 예를 들어 (평가되지 않음) :
var subject = new BehaviorSubject({1:'apple',2:'banana'});
var observable = subject.asObservable();
observable
.pipe(
first(), // <-- Ensures no stack overflow
flatMap(function(obj) {
obj[3] = 'pear';
return of(obj);
})
)
.subscribe(function(obj) {
subject.next(obj);
});
M Fuat NUROĞLU에서 Observable을 약속으로 변환하는 것에 대한 놀라운 답변을 확장하면 여기에 매우 편리한 버전이 있습니다.
const value = await observable.toPromise();
console.log(value)
이것의 장점은 다른 중첩 블록을 도입하지 않고도 해당 값을 일반 변수처럼 사용할 수 있다는 것입니다!
이는 여러 관측 가능 항목에서 여러 값을 가져와야 할 때 특히 유용합니다. 청초한.
const content = await contentObservable.toPromise();
const isAuthenticated = await isAuthenticatedObservable.toPromise();
if(isAuthenticated){
service.foo(content)
}
물론이 경로를 사용하려면 포함 기능을 만들어야 async
합니다. .then
포함 함수가 비동기 적이기를 원하지 않는 경우 에도 약속을 할 수 있습니다
이 접근 방식과의 타협이 있는지 확실하지 않으면 의견에 언제든지 알려주십시오.
PS이 답변이 마음에 드 셨다면, M Fuat NUROĞLU의 답변을 공감하는 것을 잊지 마십시오 :)
나는 비슷한 질문을했다.
아래는 다른 상태 체인저에서 나중에 호출되었습니다. 내가 원하지 않았던 것처럼.
function foo() {
// this was called many times which was not needed
observable.subscribe(func);
changeObservableState("new value");
}
unsubscribe()
아래와 같이 구독 후 시도하기로 결정했습니다 .
function foo() {
// this was called ONE TIME
observable.subscribe(func).unsubscribe();
changeObservableState("new value");
}
subscribe(func).unsubscribe();
같다 subscribeOnce(func)
.
도움이 되었기를 바랍니다.