IT이야기

rxjs 시간 초과 - 첫 번째 값

cyworld 2022. 3. 18. 21:50
반응형

rxjs 시간 초과 - 첫 번째 값

그래서 내가 여기서 이 질문을 통해 이해한 것처럼 나는 그것을 이해했다.timeout관측 가능이 주어진 시간 창에서 어떤 값도 방출하지 않는 경우 연산자 오류...문제는 이 시간의 창이 각각의 방출 후에 재설정된다는 것이다. 따라서 첫 번째 값이 창 안에서 방출되는 경우에만 시퀀스를 완료해야 한다.

"먼저 할 수 있는" 좋은 방법이 있을까?이외에.take(1).timeout(1000)?

@Maxime의 대답 외에도 인종을 이용하여 관찰할 수 있는 첫 번째 값과 타임아웃 사이의 경주를 만들 수 있다.우리는 합쳐서 타임아웃을 구성한다.never와 함께timeout.

따라서 우리는 관찰할 수 있는 당신의 원천과 관찰할 수 있는 것 사이의 경쟁으로 끝나게 되는데, 그것은 결코 가치를 발산하지 않을 것이지만, 시간이 지나면 오류를 던질 것이다.관측 가능한 소스가 첫 번째 값을 생성하면race관찰할 수 있는 시간 초과에 대해 듣는 것을 멈출 것이다.

const timed = source.race(Observable.never().timeout(1000));

내가 알고 있는 한 먼저 시간 초과가 없다. 그리고 여기 그것을 하는 방법이 있다.
(플런크러 이용 가능)

const { Observable } = Rx;

// this function can be use with the let operator
// ex: someObs$.let(timeoutFirstOnly(100)).subscribe(...)
// it'll emit an error if the first value arrives later
// than timeout parameter value
const timeoutFirstOnly = timeout => observable$ => {
  const obs$ = observable$.share();

  const [firstValue$, others$] = obs$.partition((value, index) => index === 0);

  return Observable.merge(firstValue$.timeout(timeout).first(), others$);
};

const created = Rx.Observable.create(observer => {
  // here, this is working
  // try to emit at 150ms for example and it'll throw an error
  setTimeout(() => observer.next(42), 150);
});

created
  .let(timeoutFirstOnly(100))
  .subscribe(
    val => console.log(`received ${val}`),
    error => console.log(`threw ${error}`)
  );

그러나, 나는 다른 방법이 있을지도 모른다는 생각이 들어 기터에 대해 물었고 @Dorus는 나에게 더 나은 결과를 주었다.

created.publish(src =>
  Rx.Observable.merge(
    src.take(1).timeout(100),
    src.skip(1)
  )
);

여기서 설명하건대, 모든 공은 이 일에 대해 @Dorus에게 돌아간다.

publish2가지 맛을 가지고 있다:

  1. .publish() : ConnectableObservable<T>
  2. .publish(selector : (src : Observable<T>) => Observable<R>): Observable<R>

.publish()a를 반환하다ConnectableObservable그리고 전화로도 사용할 수 있다.refCount그럭저럭connect직접 해보는 거야 .publish(selector)선택기에서 멀티캐스트된 소스를 사용하고 결과를 내보내십시오.그런데,.publish()와 같다.multicast(() => new Subject())그리고.publish(selector)와 같다.multicast(() => new Subject(), selector).

또한.publish().refCount()와 거의 같다.share()전화하는 것이 옳다.share전에partition그것은 부분적으로 문제를 해결한다.나는 여전히 더 좋아한다..publish(selector)왜냐하면 더 안전하기 때문이다..publish(selector)셀렉터를 작동시키고subscribe모든 출처를 대상으로 관찰 가능한 출처를 구독하기 전에.공유를 통해 1차 구독은 소스를 활성화하고, 2차 구독에서는 어떤 동기화라도 놓치게 된다.이는 전체 동기화 소스를 사용하는 것만큼 심각할 수 있으며, 두 번째 구독은 소스를 완전히 재실행할 수 있다.

마지막 추가 기능:.publish(selector)와 같은 서명을 하고 있다..let(selector)그렇지만let소스를 멀티캐스트하지 않는다.그것이 차이점이다.

이제 RXJS 7을 사용하여timeout({first: 1000})이 사용 사례의 경우:)

RXJS 시간 초과 연산자 설명서

참조URL: https://stackoverflow.com/questions/46886073/rxjs-timeout-to-first-value

반응형