itsource

고온 및 저온 관측 가능: '열온' 및 '냉온' 연산자가 있습니까?

mycopycode 2023. 7. 26. 22:03
반응형

고온 및 저온 관측 가능: '열온' 및 '냉온' 연산자가 있습니까?

저는 다음 SO 질문을 검토했습니다.고온 및 저온 관측 가능한 항목은 무엇입니까?

요약:

  • 콜드 관찰 대상은 관찰자가 해당 값을 소비할 때 값을 방출합니다. 즉, 관찰자가 수신한 값의 순서는 구독 시간과 무관합니다.모든 관찰자는 동일한 일련의 값을 사용합니다.
  • 핫 관측 가능은 구독과 독립적으로 값을 방출합니다. 즉, 관찰자가 수신한 값은 구독 시간의 함수입니다.

하지만, 저는 더운 것과 추운 것이 여전히 혼란의 원인인 것처럼 느껴집니다.제 질문은 다음과 같습니다.

  • 관찰 가능한 모든 rx가 기본적으로 차가운 상태입니까(피험자 제외)?

    저는 종종 사건들이 뜨거운 관측 가능성에 대한 전형적인 은유라는 것을 읽지만, 저는 또한 읽습니다.Rx.fromEvent(input, 'click')감기를 관찰할 수 있습니까(?).

  • 관측치로 ? ( 연산자 에)publish,그리고.share)?

    를 들어, 연산자 예어들, Rx 연와함방법과 합니까?withLatestFromcold$어디선가 구독한 적이 있는 차가운 관찰 대상입니다.할 것이다sth$.withLatestFrom(cold$,...)주목받는 인물입니까?

    아니면 제가 한다면요.sth1$.withLatestFrom(cold$,...), sth2$.withLatestFrom(cold$,...).sth1그리고.sth2 다 항 상 볼 수 있 니 습 까 값 을 같 은 ? 까 니 ▁both ▁for 있 ▁value ▁the ▁see ▁will ▁same ▁always ▁i 습 둘 수 다 볼sth?

  • 내 생각에는 말이지…Rx.fromEvent차가운 관측치를 생성하지만 답변 중 하나에서 언급한 것처럼 그렇지 않습니다.하지만, 저는 여전히 이러한 행동에 당황하고 있습니다: https://codepen.io/anon/pen/NqQMJR?editors=101 .서로 다른 구독은 동일한 관측 가능한 값에서 서로 다른 값을 가져옵니다.아니었습니까?click이벤트 공유?

저는 몇 달 후에 원래 질문으로 돌아오고 그동안 배운 지식을 공유하고 싶었습니다.다음 코드를 설명 지원(jsfidle)으로 사용합니다.

var ta_count = document.getElementById('ta_count');
var ta_result = document.getElementById('ta_result');
var threshold = 3;

function emits ( who, who_ ) {return function ( x ) {
  who.innerHTML = [who.innerHTML, who_ + " emits " + JSON.stringify(x)].join("\n");
};}

var messages$ = Rx.Observable.create(function (observer){
  var count= 0;
  setInterval(function(){
    observer.onNext(++count);
  }, 1000)
})
.do(emits(ta_count, 'count'))
.map(function(count){return count < threshold})
.do(emits(ta_result, 'result'))

messages$.subscribe(function(){});

답변 중 하나에서 언급한 것처럼 관찰 가능한 항목을 정의하면 일련의 콜백 및 매개 변수 등록이 수행됩니다. 흐름은 데터흐름시하며, 다을수다니됩행을 .subscribe기능. (위해) 자세한 흐름은 그 에 확인할 수 .이후에는 (설명을 위해 단순화된) 자세한 흐름을 확인할 수 있습니다.

Simplified flow diagram

관찰 가능한 항목은 기본적으로 콜드입니다.관찰 가능한 항목에 가입하면 업스트림 가입 체인이 발생합니다.마지막 구독은 소스를 처리하고 해당 데이터를 관찰자에게 보내는 함수의 실행으로 이어집니다.

그 관찰자는 다음 관찰자에게 방출하고, 그 결과 데이터의 다운스트림 흐름이 싱크 관찰자에게 전달됩니다.다음 단순화된 그림은 두 가입자가 동일한 관찰 가능 항목에 가입할 때의 가입 및 데이터 흐름을 보여줍니다.

Cold observable simplified flow diagram

핫 관찰 가능한 항목은 제목을 사용하거나 를 통해 생성할 수 있습니다.multicast연산자(및 그 파생물, 아래 주 3 참조).

multicast후드 아래에 있는 연산자는 피사체를 사용하고 연결 가능한 관찰 가능한 것을 반환합니다.연산자에 대한 모든 구독은 내부 제목에 대한 구독입니다.connect이 호출되고, 내부 주체가 관찰 가능한 업스트림에 가입하며, 데이터는 다운스트림으로 흐릅니다.주체는 가입된 관찰자 목록을 내부적으로 조작하고 가입된 모든 관찰자에게 수신되는 데이터를 멀티캐스트합니다.

다음 다이어그램은 상황을 요약합니다.

Hot observable simplified flow diagram

결국 관찰자 패턴과 연산자의 구현으로 인한 데이터 흐름을 이해하는 것이 더 중요합니다.

를 들어, 예를들어, 에약만 경우.obs 죠덥?hotOrCold = obs.op1추운가요 더운가요?이든: 답이무든간에이엇:간:

  • 의 가 없는 obs.op1가 데가이않을 통해 .op1 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜobs은 그은곧것을 의미합니다.obs.op1될 수 . 즉, 데이터 조각이 손실될 수 있습니다.
  • op1연산자가 , 에두 번구멀같아은다에 두 번합니다.hotOrCold 번 할 것입니다.op1 리고모 가이들치든의 값.obs 두 번 .op1.

주의:

  1. 이 정보는 Rxjs v4에 대해 유효해야 합니다.버전 5는 상당한 변화를 겪었지만, 대부분은 여전히 그대로 적용됩니다.
  2. 구독 취소, 오류 및 완료 흐름은 질문 범위에 포함되지 않으므로 표시되지 않습니다.스케줄러도 고려되지 않습니다.무엇보다도 데이터 흐름의 타이밍에 영향을 미치지만, 우선 순위는 데이터 흐름의 방향과 내용에 있습니다.
  3. 멀티캐스팅에 사용되는 주제의 유형에 따라 파생된 멀티캐스팅 연산자가 다릅니다.

Subject type | `Publish` Operator | `Share` operator ------------------ | --------------------------- | ----------------- Rx.Subject | Rx.Observable.publish | share Rx.BehaviorSubject | Rx.Observable.publishValue | shareValue Rx.AsyncSubject | Rx.Observable.publishLast | N/A Rx.ReplaySubject | Rx.Observable.replay | shareReplay

업데이트 : Ben Lesh의 그 주제에 대한 다음 기사들도 참고하세요.

주제에 대한 자세한 내용은 이 다른 SO 질문에서 확인할 수 있습니다: 다양한 RxJS 주제의 의미는 무엇입니까?

당신의 요약과 연결된 질문이 모두 맞습니다, 저는 그 용어가 당신을 혼란스럽게 할 수 있다고 생각합니다.고온 관측치와 저온 관측치를 (각각) 능동 관측치와 수동 관측치로 생각할 것을 제안합니다.

즉, 사용 중인 (핫) 관찰 가능한 항목이 누군가 구독했는지 여부에 관계없이 항목을 내보냅니다.일반적인 예로, 버튼 클릭 이벤트는 누군가가 듣고 있든 없든 발생합니다.예를 들어 버튼을 클릭한 다음 버튼 클릭에 가입하면(그 순서대로) 이미 발생한 버튼 클릭이 표시되지 않기 때문에 이러한 구분이 중요합니다.

수동(콜드) 관찰 가능한 항목은 가입자가 존재할 때까지 기다렸다가 항목을 내보냅니다.누군가 이벤트를 들을 때까지 클릭할 수 없는 버튼을 상상해 보십시오. 그러면 클릭 이벤트가 하나씩 표시됩니다.

기본적으로 모든 Rx가 "콜드"(또는 패시브)입니까? 아니요,Rx.fromEvent(input, 'click')예를 들어 핫(또는 활성) 관측 가능입니다.

저도 읽었습니다.Rx.fromEvent(input, 'click')감기는 관찰 가능(?)입니까?

그렇지 않습니다.

차가운 관측치를 뜨거운 관측치로 바꾸는 Rx 연산자가 있습니까?

관찰 가능한 핫(액티브)을 콜드(패시브) 관찰 가능한 콜드(패시브)로 전환하는 개념은 다음과 같습니다. 구독되지 않은 동안 발생하는 이벤트를 기록하고 향후에 제공되는 구독자에게 해당 항목을 (다양한 방식으로) 제공해야 합니다.한 가지 방법은 제목을 사용하는 것입니다.예를 들어, 다음을 사용할 수 있습니다.ReplaySubject내보낸 항목을 버퍼링하여 향후 가입자에게 재생합니다.

명명한 두 개의 .publish그리고.share둘 다 내부적으로 제목을 사용하여 해당 기능을 제공합니다.

연산자 Rx와 입니까?withLatestFromcold$찬밥 신세가 되다할 것이다something$.withLatestFrom(cold$,...)주목받는 인물입니까?

한다면something네, 그렇습니다. 만약에.something감기를 관찰할 수 있다면, 아니요.이벤트 예제로 돌아가기, 만약something입니다.

var clickWith3 = Rx.fromEvent(input, 'click')
    .withLatest(Rx.Observable.from([1, 2, 3]);

아니면 제가 한다면요.foo$.withLatestFrom(cold$,...), bar$.withLatestFrom(cold$,...).foo그리고.bar둘 다 항상 같은 값이 표시됩니까?

항상은 아냐.다시, 만약에foo그리고.bar예를 들어 다른 버튼을 클릭하면 다른 값이 표시됩니다.또한, 같은 버튼일지라도, 만약 당신의 조합 함수(두 번째 인수는withLatest)는 동일한 입력에 대해 동일한 결과를 반환하지 않습니다. 그러면 동일한 값이 표시되지 않습니다(아래 설명과 같이 두 번 호출되므로).

내 생각에는 말이지…Rx.fromEvent차가운 관측치를 생성하지만 답변 중 하나에서 언급한 것처럼 그렇지 않습니다.하지만, 저는 여전히 이러한 행동에 당황하고 있습니다: codepen.io/anon/pen/NqQMJR?editors=101 .서로 다른 구독은 동일한 관측 가능한 값에서 서로 다른 값을 가져옵니다.아니었습니까?click이벤트 공유?

제가 같은 행동에 대해 가지고 있던 질문에 대한 Enigmativity의 훌륭한 답변을 알려드리겠습니다.그 대답은 제가 설명할 수 있는 것보다 훨씬 더 잘 설명하겠지만, 요점은 소스(클릭 이벤트)가 "공유"된다는 것입니다. 네, 하지만 당신의 작업은 그렇지 않습니다.클릭 이벤트뿐만 아니라 이벤트에 대한 작업도 공유하려면 명시적으로 공유해야 합니다.

values당신의 코드펜은 게으릅니다. 어떤 것이 가입하기 전까지는 아무 일도 일어나지 않습니다. 그 시점에서 그것은 그것을 통과하고 그것을 배선합니다.따라서 이 예제에서는 동일한 변수에 가입하더라도 가입 호출당 하나씩, 두 개의 서로 다른 스트림을 생성합니다.

라고 생각할 수 있습니다.values의 흐름의 발생자로서.click 그으로로map첨부된.

.share()그 지도의 끝에서 우리가 예상하는 행동을 만들어 낼 것입니다. 왜냐하면 그것은 암묵적으로 가입하고 있기 때문입니다.

모든 에 대한 답은 , .fromEvent관측 가능한 것들은 뜨겁습니다.이동과 같은 " 구독("continuous" 이벤트)인 것 .addEventListener또는oncall)은 관찰 가능한 항목이 생성될 때 한 번만 수행됩니다.그래서 덥습니다.여기 저기 연산자의 소스 코드에서 볼 수 있습니다 - 생성된 관찰 가능한 것은share이벤트 이름 또는 소스에 관계없이 d.

언급URL : https://stackoverflow.com/questions/32190445/hot-and-cold-observables-are-there-hot-and-cold-operators

반응형