combine & CombineSpec

"누가 트리거하는가"와 "누가 이미 말했어야 하는가"를 위한 하나의 결합자 — 그리고 zipAllwithLatestFromAll.

FxEvents<List<T>> combine<T>(Iterable<CombineSpec<T>> specs) class CombineSpec<T>(Stream<T> source, {bool causesEmit = true, bool requireFirst = true}) FxEvents<R> FxEvents<Stream<T>>.zipAll<R>([R Function(List<T> values)? project]) FxEvents<R> FxEvents<T>.withLatestFromAll<R>(Iterable<Stream<Object?>> others, R Function(T value, List<Object?> latest) combine)

강의

combineLatest, withLatestFrom, zip의 차이는 누가 방출을 일으킬 수 있는지, 그리고 모든 쪽이 이미 말했는지를 요구하는지입니다. combine이 통합 형태입니다: CombineSpec의 리스트, 각각은 source와 플래그 둘. 최상위 함수이지 FxEvents.combine이 아닙니다 — Dart는 다른 파일에서 FxEvents에 정적 멤버를 추가할 수 없습니다.

causesEmit: true (기본값)는 이 소스의 이벤트가 출력을 만들 수 있다는 뜻입니다. 모든 requireFirst 스펙이 값을 가진 뒤에. 모두 true인 스펙은 FxEvents.combineLatestAll입니다. causesEmit: false는 이 소스가 컨텍스트뿐이라는 뜻입니다: 칸은 갱신하지만 스스로는 방출을 일으키지 않습니다 — 그것이 withLatestFrom입니다. requireFirst: true (기본값)는 이 소스가 최소 한 번 값을 만들기 전까지 모든 방출을 보류하고, false는 말할 때까지 칸을 null로 둡니다. 결과는 모든 소스가 닫혔을 때 닫힙니다.

옆에 결합자가 둘 더 있습니다. FxEvents<Stream<T>>zipAll은 아우터가 완료될 때까지 모든 내부 스트림을 모은 뒤 인덱스로 짝짓습니다 — 그때까지 내부는 구독조차 되지 않습니다. withLatestFromAll은 N항 withLatestFrom입니다: 소스 이벤트마다 다른 모든 쪽의 최신과 결합하고, 다른 쪽이 모두 말하기 전에 온 소스 이벤트는 버립니다. fxdart 이벤트 레이어, Rx의 combineLatest / withLatestFrom / zipAll을 따랐습니다.

데모 1 · 양쪽이 트리거한다

데모 2 · 컨텍스트만 — causesEmit: false

직접 해 보기

연습: 스트림의 스트림에 대한 zipAll, 그리고 소스에 대한 withLatestFromAll.

관련 항목: combineLatest — 양쪽이 트리거, 모두 true인 CombineSpec · withLatestFrom — 한쪽만, causesEmit: false 스펙 · waitAll — zip, combineLatestAll, concat