race
먼저 내보내는 후보가 이깁니다: 그 스트림 전체가 비춰지고, 다른 모든 후보는 그 자리에서 취소됩니다.
강의
캐시와 네트워크에 동시에 물어보고, 먼저 답하는 쪽을 취합니다.
다운로드 미러 셋을 시도하고, 가장 빠른 것을 남깁니다.
FxEvents.race(candidates)는 모든 후보를 한꺼번에
구독하고, 어디서든 나온 첫 이벤트가 승부를 결정합니다: 그
이벤트가 전달되고, 진 후보들은 모두 즉시
취소됩니다 — 음소거가 아니라 취소입니다. 그들의 소켓은
닫히고, 작업은 멈추고, 이벤트는 일어나지 않습니다.
무엇이 이기는지 정확히 해 둡시다: 어디서든 나온 첫 이벤트가 승자를
고르고, 그때부터 race는 이긴 스트림을 온전히
비춥니다 — 이후 그 스트림이 만들어 내는 모든 이벤트가
흘러오고, 승자가 닫히면 race도 닫힙니다. 에러도 이길 수
있습니다: 빠르게 고장 난 엔드포인트가 느리지만 건강한 것을
이깁니다. 이것이 정확히 정직한 동작입니다 — 누가 먼저 답하는지
물었고, "실패했다"도 하나의 답이니까요. 느리고 불안정한 구간은
경주에 내보내기 전에 각 후보에
timeout/retry로
안전장치를 거세요.
한 번도 내보내지 않고 닫히는 후보는 조용히 탈락합니다. 모두가
그렇거나 — 후보 목록이 비어 있으면 — race는 빈 채로 닫힙니다.
이웃과의 취소 방향 차이에 주목하세요:
switchMap은 연속된 스트림
중 더 오래된 쪽을 취소하고, race는 동시의
스트림 중 더 느린 쪽을 취소합니다. fxdart 이벤트 계층이며,
Rx의 race/amb를 따랐습니다.
데모 1 · 캐시 대 네트워크, 진 쪽은 취소
데모 2 · 에러도 이길 수 있고, 빈 후보는 탈락한다
직접 해 보기
연습: 세 미러 중 가장 빠른 것.