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


107

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

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

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

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

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

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


소스를 기다리려는 나머지 코드를 .subscribe()메서드 호출 로 이동할 수 없습니까 ?
StriplingWarrior 2015

답변:


133

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

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

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


3
take (1) 대신 사용할 수 await observable.first().toPromise();있습니까?
apricity

14
@apricity 완료시 값이 없으면 first()거부되고 take(1)약속 보류 상태가됩니다.
Estus Flask

6
@apricity @AgentME 실제로 이런 경우 take(1)에도 사용해서는 안됩니다 first(). 정확히 하나의 이벤트가 발생할 것으로 예상 single()하기 때문에 1 개 이상인 경우 예외를 throw하고 아무 것도 없을 때 예외를 throw하지 않는 사용 을 사용해야합니다 . 하나 이상이있는 경우 코드 / 데이터 모델 등에 문제가있을 수 있습니다. single을 사용하지 않으면 더 많은 것이 있다는 경고없이 반환되는 첫 번째 항목을 임의로 선택하게됩니다. 항상 동일한 순서를 유지하려면 업스트림 데이터 소스의 술어에주의해야합니다.
ntziolis

3
가져 오기를 잊지 마세요 :import 'rxjs/add/operator/first';
Stephanie

7
이제 toPromise ()가 더 이상 사용되지 않습니다. 어떻게해야합니까?
Jus10

26

그것은 아마도

await observable.first().toPromise();

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

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

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


실제로 take(1)것입니다 하지 보류 약속을 얻을 수 있습니다. 로 해결 된 약속을 산출합니다 undefined.
Johan t Hart

알아 주셔서 감사합니다. 맞습니다. 게시물이 왜 다른지 잘 모르겠습니다. 어떤 시점에서 행동이 변경되었을 수 있습니다.
Estus Flask

8

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


4

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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.