code

Rx Observable에서 어떻게 '기다릴' 수 있습니까?

starcafe 2023. 8. 16. 22:30
반응형

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

반응형