Rx Observable에서 어떻게 '기다릴' 수 있습니까?
저는 관찰 가능한 것을 기다릴 수 있기를 원합니다. 예를 들어,
const source = Rx.Observable.create(/* ... */)
//...
await source;
단순한 시도로 대기가 즉시 해결되고 실행이 차단되지 않습니다.
편집: 나의 완전한 사용 사례에 대한 의사 코드는 다음과 같습니다.
if (condition) {
await observable;
}
// a bunch of other code
다른 코드를 다른 별도의 기능으로 이동하여 구독 콜백에 전달할 수 있다는 것은 이해하지만, 저는 그것을 피할 수 있기를 바랍니다.
당신은 약속을 통과해야 합니다.await
관찰 가능한 다음 이벤트를 약속으로 변환하고 기다립니다.
if (condition) {
await observable.first().toPromise();
}
노트 편집:이 답변은 원래 .take(1)를 사용했지만 값이 전달되기 전에 스트림이 종료되면 Promise never resolving 문제를 방지하는 .first()를 사용하도록 변경되었습니다.
RxJS v8 기준,toPromise
제거됩니다.대신 위의 내용을 다음과 같이 대체할 수 있습니다.await firstValueFrom(observable)
새 기능 사용firstValueFrom()
또는lastValueFrom()
대신에toPromise()
여기서 지적한 바와 같이, RxJS 7부터는 더 이상 사용되지 않으며, RxJS 8에서는 제거될 예정입니다.
import { firstValueFrom} from 'rxjs';
import { lastValueFrom } from 'rxjs';
this.myProp = await firstValueFrom(myObservable$);
this.myProp = await lastValueFrom(myObservable$);
RxJS 7+에서 사용할 수 있습니다.
참조: https://indepth.dev/rxjs-heads-up-topromise-is-decret/
그럴 가능성이 높습니다.
await observable.first().toPromise();
이전에 댓글에서 언급했듯이, 사이에는 상당한 차이가 있습니다.take(1)
그리고.first()
관측 가능한 빈 완료가 있을 때 연산자.
Observable.empty().first().toPromise()
그에 따라 처리할 수 있는 거부 결과를 초래할 것입니다. 왜냐하면 실제로 가치가 없었기 때문입니다.
그리고.Observable.empty().take(1).toPromise()
으로 해결될 것입니다.undefined
가치.
편집:
.toPromise()
이제 RxJS 7에서 더 이상 사용되지 않습니다(출처: https://rxjs.dev/deprecisions/to-promise).
새 답변:
더 이상 사용되지 않는 Promise() 메서드를 대체하려면 두 개의 내장 정적 변환 함수 firstValueFrom 또는 lastValueFrom 중 하나를 사용해야 합니다.
예:
import { interval, lastValueFrom } from 'rxjs';
import { take } from 'rxjs/operators';
async function execute() {
const source$ = interval(2000).pipe(take(10));
const finalNumber = await lastValueFrom(source$);
console.log(`The final number is ${finalNumber}`);
}
execute();
// Expected output:
// "The final number is 9"
이전 답변:
한다면toPromise
더 이상 사용하지 않습니다. 사용할 수 있습니다..pipe(take(1)).toPromise
하지만 여기 보시는 것처럼, 그것은 사용되지 않습니다.
그러니 그냥 사용해 주세요.toPromise
(RxJs 6)는 다음과 같습니다.
//return basic observable
const sample = val => Rx.Observable.of(val).delay(5000);
//convert basic observable to promise
const example = sample('First Example')
.toPromise()
//output: 'First Example'
.then(result => {
console.log('From Promise:', result);
});
비동기/비동기화 예제:
//return basic observable
const sample = val => Rx.Observable.of(val).delay(5000);
//convert basic observable to promise
const example = await sample('First Example').toPromise()
// output: 'First Example'
console.log('From Promise:', result);
자세한 내용은 여기를 참조하십시오.
필요할 것입니다.await
약속, 그래서 당신은 사용하고 싶을 것입니다.toPromise()
자세한 내용은 다음을 참조하십시오.toPromise()
.
사용.toPromise()
RxJs 7 이후에는 감가상각되기 때문에 권장되지 않습니다.RxJs 7에 있는 두 개의 새 연산자를 사용할 수 있습니다.lastValueFrom()
그리고.firstValueFrom()
자세한 내용은 여기에서 확인할 수 있습니다.
const result = await lastValueFrom(myObservable$);
베타 버전의 구현은 다음 사이트에서 사용할 수 있습니다.
V 6을 사용하고 에 V RxJS V 6.4.되지 않는 .toPromise()
다른 답변에서 영감을 받아 다음과 같이 작업했습니다.toPromise()
import { first, ... } from 'rxjs/operators';
...
if (condition) {
await observable$.pipe(first()).toPromise();
}
...
사용 방법 참고last()
富士山의 pipe()
는 ㅠㅠㅠㅠㅠㅠㅠㅠㅠobservable.first()
Macil이 언급한 것처럼 작동하지 않습니다.
이것이 저처럼 RxJS V 6.x.x를 사용하는 다른 사람들에게 도움이 되기를 바랍니다 :).
감사해요.
언급URL : https://stackoverflow.com/questions/34190375/how-can-i-await-on-an-rx-observable
'code' 카테고리의 다른 글
클래스 제거 시 CSS 애니메이션을 되돌릴 수 있습니까? (0) | 2023.08.16 |
---|---|
새 csproj 파일 구조를 ASP와 함께 사용할 수 있습니까?NET Framework 프로젝트? (0) | 2023.08.16 |
PowerShell 코드 정리 또는 재포맷? (0) | 2023.08.16 |
정수에서 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2023.08.16 |
로컬 호스트에서만 Fiddler 사용 (0) | 2023.08.16 |