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에게 돌아간다.
publish
2가지 맛을 가지고 있다:
.publish() : ConnectableObservable<T>
.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})
이 사용 사례의 경우:)
참조URL: https://stackoverflow.com/questions/46886073/rxjs-timeout-to-first-value
'IT이야기' 카테고리의 다른 글
Vue 구성 요소에서 통화를 포맷하려면 어떻게 해야 하는가? (0) | 2022.03.18 |
---|---|
UnicodeEncodeError: 'ascII' 코덱이 위치 20에서 문자 u'\xa0'을 인코딩할 수 없음: 서수가 범위(128)에 없음 (0) | 2022.03.18 |
TouchableOpacity에 대한 "상승" 또는 Shadow 효과 생성:네이티브 리액션 (0) | 2022.03.18 |
각각은 JavaScript 배열의 함수 오류가 아님 (0) | 2022.03.18 |
생산 중단 후 재부팅 시 반응-검은색 화면 (0) | 2022.03.18 |