[javascript] Rx Observable에서 어떻게`대기`할 수 있습니까?

관찰 가능한 것을 기다릴 수 있기를 바랍니다.

const source = Rx.Observable.create(/* ... */)
//...
await source;

순진한 시도는 await가 즉시 해결되고 실행을 차단하지 않습니다.

편집 : 내 전체 사용 사례의 의사 코드는 다음과 같습니다.

if (condition) {
  await observable;
}
// a bunch of other code

다른 코드를 다른 별도의 함수로 이동하여 구독 콜백에 전달할 수 있다는 것을 이해하지만이를 피할 수 있기를 바랍니다.



답변

에 대한 약속을 전달해야합니다 await. Observable의 다음 이벤트를 promise로 변환하고 기다립니다.

if (condition) {
  await observable.first().toPromise();
}

편집 참고 :이 답변은 원래 .take (1)을 사용했지만 .first ()를 사용하도록 변경되어 값이 도착하기 전에 스트림이 끝나는 경우 Promise가 해결되지 않는 문제를 방지합니다.


답변

그것은 아마도

await observable.first().toPromise();

이전에 주석에서 언급했듯이 비어있는 완성 된 Observable이있을 때 take(1)first()연산자 사이에는 상당한 차이가 있습니다.

Observable.empty().first().toPromise()EmptyError실제로 가치가 없기 때문에 그에 따라 처리 할 수있는 거부로 이어 집니다.

그리고 가치 Observable.empty().take(1).toPromise()있는 해결책이 될 것 undefined입니다.


답변

await약속 이 필요 하므로 toPromise(). 참조 에 대한 자세한 내용은 toPromise().


답변

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);
  });

async / await 예 :

//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);

여기에서 자세한 내용을 읽어보십시오 .

그리고이 잘못된 주장을 삭제하십시오 toPromise.


답변