Rx 응답 식 프로 그래 밍
9354 단어 Rx응답 식 프로 그래 밍
Observable 은 말 그대로'관찰 가능 자'라 고 부 릅 니 다.다시 말 하면 특정한'데이터 소스'나'사건 소스'입 니 다.이런 데이터 소스 는 관찰 할 수 있 는 능력 을 가지 고 있 습 니 다.이것 은 당신 이 자발적으로 데 이 터 를 건 지 는 것 과 본질 적 인 차이 가 있 습 니 다.하나의 이미지 로 비유 하면 Observable 은 수도꼭지 와 같 습 니 다.수도 꼭 지 를 틀 어도 됩 니 다.Observable 을 구독 한 후에 물-데이터 가 끊임없이 흘러 나 옵 니 다.이것 이 바로 응답 식 프로 그래 밍 의 핵심 사상 인 주동 적 으로 수 동적 으로 변 하 는 것 이다.그러나 이것 은 이 글 에서 상세 하 게 설명 하지 않 는 다.
Observable 은 하나의 개념 으로 서로 다른 방식 으로 구체 적 으로 실현 할 수 있다.본 고 는 고급 함 수 를 통 해 두 가지 상용 Observable:from Event 와 Interval 을 실현 한다.Observable 에 대한 구독 과 구독 취소 두 가지 행 위 를 설명 함으로써 독자 들 이 Observable 이 무엇 인지 진정 으로 이해 하도록 도와 준다.
2.고급 함수
고급 함수 의 개념 은 함수 식 프로 그래 밍 에서 유래 한 것 으로 간단 한 정 의 는 함수 의 입 참 또는 반환 값 은 함수 의 함수 이다.예 를 들 면:
function foo(arg){
return function(){
console.log(arg)
}
}
const bar = foo(“hello world”)
bar() // hello world
ps:고급 함수 가 할 수 있 는 일이 많 습 니 다.여 기 는 본 논문 에 필요 한 상황 에 만 사용 합 니 다.위의 이 foo 함수 호출 은 hello World 를 직접 인쇄 하지 않 고 이 hello World 를 캐 시 합 니 다.다음 에 우 리 는 실제 수요 에 따라 되 돌아 온 bar 함 수 를 호출 한 다음 에 hello World 를 인쇄 하 는 작업 을 진정 으로 수행 합 니 다.
왜 이렇게 포장 을 해 야 합 니까?실제로 이렇게 하 는 효 과 는 바로'지연'호출 이다.모든 정 수 는 이'지연'이라는 두 글자 안에 있다.우 리 는 실제로 택배 상자 처럼 보 이 는 행동 을 포장 했다.
안 에는 다른 물건 을 담 을 수 있 지만 물류 에 있어 서 는 통 일 된 물건 이다.따라서 택배 상자 에 대한 통일 적 인 조작 을 형성 할 수 있다.예 를 들 어 쌓 기,운송,저장,심지어 상 자 를 여 는 동작 도 일치 하 다.
앞의 예 로 돌아 가 foo 함 수 를 호출 하 는 것 은 택배 상 자 를 포장 한 것 과 같 습 니 다.이 택배 상자 안에 고정된 프로그램 이 있 습 니 다.바로 이 택배 상자(bar 호출)를 열 때 인쇄 작업 을 수행 하 는 것 입 니 다.
우 리 는 foo 1,foo 2,foo 3..........................................................................전 제 는 이 foo 가 함 수 를 되 돌려 주 는 것 입 니 다.그래 야'열기'동작,즉 되 돌아 오 는 함 수 를 만족 시 킬 수 있 습 니 다.
function foo1(arg){
return function(){
console.log(arg+"?")
}
}
function foo2(arg){
return function(){
console.log(arg+"!")
}
}
const bar1 = foo1(“hello world”)
const bar2 = foo2("yes")
bar1()+bar2() // hello world? yes!
3.택배 박스 모델3.1 택배 박스 모델 1:from Event
위의 기초 가 있 으 면 Rx 프로 그래 밍 에서 가장 자주 사용 하 는 Observable-from Event(...)를 살 펴 보 겠 습 니 다.Rx 프로 그래 밍 초보 자 에 대해 서 는 처음에는 from Event(...)와 addEventListener(...)가 어떤 차이 가 있 는 지 이해 하기 어 려 웠 다.
btn.addEventListener("click",callback)
rx.fromEvent(btn,"click").subscribe(callback)
이 코드 를 직접 실행 하면 확실히 효과 가 같다.그럼 차 이 는 어디 에 있 습 니까?가장 직접적인 차 이 는 subscribe 함수 가 btn 이 아 닌 fromEvent(...)에 작용 하 는 것 이 고,addEventListener 는 btn 에 직접적 으로 작용 하 는 것 이다.subscribe 함 수 는 일종 의'열기'동작 이 고 from Event(...)는 일종 의 택배 상자 입 니 다.from Event 는 실제로 addEventListener 에 대한"지연"호출 입 니 다.
function fromEvent(target,evtName){
return function(callback){
target.addEventListener(evtName,callback)
}
}
const ob = fromEvent(btn,"click")
ob(console.log)// subscribe
읊다,읊조리다from Event 는 본질 적 으로 고급 함수 입 니 다.subscribe 를 어떻게 실현 하여'열기'작업 을 완성 하 는 지 에 대해 본 논문 의 토론 범위 에 있 지 않 고 Rx 프로 그래 밍 에서 이 subscribe 의 동작 을'구독'이 라 고 합 니 다.'구독'은 모든 Observable 이 통일 적 으로 갖 춘 조작 이다.다시 한 번 강조 하 자 면 본 논문 에서 Observable 에 대한'호출'은 논리 적 으로 subscribe 에 해당 한다.
다음은 예 를 하나 더 들 면 기본적으로 독자 로 하여 금 2 반 N 을 들 게 할 수 있다.
3.2 택배 박스 모델 2:interval
Rx 에 interval 이 있 는데 setInterval 과 어떤 차이 가 있 습 니까?
누군가가 이미 앞 다 투어 대답 하기 시 작 했 을 것 이다.interval 은 setInterval 에 대한 지연 호출 이다!bingo!
function interval(period){
let i = 0
return function(callback){
setInterval(period,()=>callback(i++))
}
}
const ob = interval(1000)
ob(console.log)// subscribe
위의 두 가지 예 를 보면 from Event(...)든 Interval(...)이 든 내 부 는 완전히 다른 논리 이지 만 그들 은'택배 박스'라 는 것 에 속 하기 때문에 우 리 는 그것 을 Observable―관찰자 라 고 부른다.fromEvent 와 Interval 자 체 는'택배 함'을 만 드 는 모델 일 뿐 호출 후 되 돌아 오 는 것 만 이'택배 함',즉 fromEvent(btn,'click'),interval(1000)등...
4.고급 택배 상자
위의 기초 가 있 으 면 아래 에서 진급 을 시작 합 니 다.우 리 는 그렇게 많은 택배 상 자 를 가지 고 있 으 면 이 택배 상자 들 을 다시 포장 할 수 있 습 니 다.
글 의 첫머리 에 택배 상자 가 일부 조작 을 통일 시 켰 기 때문에 우 리 는 많은 택배 상 자 를 한데 쌓 을 수 있다.즉,큰 택배 상자 로 조합 할 수 있다!이 큰 택배 함 은 작은 택배 함 과 마찬가지 로'열기'조작(즉 구독)이 있다.우리 가 이 큰 택배 상 자 를 열 었 을 때 무슨 일이 일어 날 까요?
작은 택배 상자(concat)를 하나씩 열 거나 작은 택배 상자(merge)를 한꺼번에 열 수도 있 고 가장 쉽게 열 리 는 택배 상자(race)만 열 수도 있다.
다음은 간단 한 merge 방법 입 니 다.
function merge(...obs){
return function(callback){
obs.forEach(ob=>ob(callback)) //
}
}
우 리 는 이전의 from Event 와 interval 을 가지 고 예 를 들 자!merge 방법 으로 Observable 두 개 를 조합 합 니 다:
const ob1 = fromEvent(btn,'click') // 1
const ob2 = interval(1000) // 2
const ob = merge(ob1,ob2) //
ob(console.log) //
우리 가'열기'(구독)라 는 큰 택배 상자 ob 를 열 었 을 때,그 중 두 개의 작은 택배 상자 도'열기'(구독)되 고,어떤 작은 택배 상자 안의 논리 도 실행 되 며,우 리 는 두 개의 Observable 을 합 쳐 하나의 것 이 되 었 다.이것 이 바로 우리 가 각종 비동기 함 수 를 택배 상자(Observable)로 포장 하 는 이유 입 니 다.그들 에 게 통일 적 으로 조작 할 수 있 도록 편리 합 니 다!물론'열기'(구독)만 있 습 니 다.이 조작 은 초급 기능 일 뿐 입 니 다.다음은 진급 을 시작 합 니 다.
5.택배 박스 소각
5.1,택배 박스 폐기-구독 취소
우 리 는 fromEvent 를 예 로 들 었 습 니 다.이전에 우 리 는 간단 한 고급 함 수 를 써 서 addEventListener 에 대한 패키지 로 삼 았 습 니 다.
function fromEvent(target,evtName){
return function(callback){
target.addEventListener(evtName,callback)
}
}
우리 가 이 함 수 를 호출 할 때 택배 상자(from Event(btn,click)가 생 성 되 었 습 니 다.우리 가 이 함수 가 되 돌아 오 는 함 수 를 호출 했 을 때 택배 상자(from Event(btn,click)(console.log)를 열 었 습 니 다.그럼 저희 가 이 열 린 택배 상 자 를 어떻게 없 애 죠?
우선 우 리 는 이미 열 린 택배 상 자 를 받 아야 합 니 다.위의 함수 호출 결 과 는 void 입 니 다.우 리 는 어떠한 조작 도 할 수 없 기 때문에 열 린 상태의 택배 상 자 를 만들어 야 합 니 다.아니면 고급 함 수 를 사용 하 는 사상:되 돌아 오 는 함수 에서 함 수 를 하나 더 되 돌려 서 소각 작업 에 사용 합 니 다.
function fromEvent(target,evtName){
return function(callback){
target.addEventListener(evtName,callback)
return function(){
target.removeEventListener(evtName,callback)
}
}
}
const ob = fromEvent(btn,'click') //
const sub = ob(console.log) // ,
sub() //
마찬가지 로 interval 에 대해 서도 우 리 는 법 대로 만 들 수 있다.
function interval(period){
let i = 0
return function(callback){
let id = setInterval(period,()=>callback(i++))
return function(){
clearInterval(id)
}
}
}
const ob = interval(1000) //
const sub = ob(console.log) //
sub() //
5.2,고급 택배 박스 소각우 리 는 merge 를 예 로 들 면:
function merge(...obs){
return function(callback){
const subs = obs.map(ob=>ob(callback)) //
return function(){
subs.forEach(sub=>sub()) //
}
}
}
const ob1 = fromEvent(btn,'click') // 1
const ob2 = interval(1000) // 2
const ob = merge(ob1,ob2) //
const sub = ob(console.log) //
sub() //
우리 가 큰 택배 상 자 를 소각 할 때,안에 있 는 모든 작은 택배 상 자 를 함께 소각 할 것 이다.여섯
여기에서 우 리 는 Observable 의 두 가지 중요 한 조작(구독,구독 취소)을 끝 냈 습 니 다.주의해 야 할 것 은 구독 취소 행 위 는 Observable 에 작용 하 는 것 이 아니 라 이미'열 린'택배 상자(Observable 구독 후 돌아 오 는 것)에 작용 합 니 다!
Observable 은 이 외 에 도 두 가지 중요 한 조작 이 있 습 니 다.즉,사건 을 보 내 고 완성/이상 을 보 내 는 것 입 니 다.(이 두 조작 은 Observable 이 주동 적 으로 시작 한 반전 에 속 하고 조작 방향 과 반대 되 기 때문에 조작 이 라 고 할 수 없습니다.)
이 두 가지 행 위 는 택배 박스 로 는 그다지 형상 적 이지 않 습 니 다.Observable 을 수도꼭지 에 비유 할 수 있 습 니 다.원래 택배 박스 를 열 었 다가 수도 꼭 지 를 틀 었 는데 우리 가 들 어 온 반전 함 수 는 물 을 받 는 물컵 에 비유 할 수 있 습 니 다!모두 가 반전 함수 에 대해 이미 매우 익숙 하기 때문에 본 고 는 더 이상 군말 하지 않 겠 다.
후기
우리 가 배 운 내용 을 정리 하면 우 리 는 고급 함 수 를 통 해 일부 조작 을'지연'시 켰 고 통 일 된 행 위 를 부여 했다.예 를 들 어'구독'은 비동기 함 수 를 지연 시 켰 다.'구독 취소'는 바로 위 에서 자원 을 파괴 하 는 함 수 를'지연'하 는 것 이다.
이른바'지연'실행 이란 Rx 프로 그래 밍 의 배후 에서 가장 이해 하기 어렵 고 가장 핵심 적 인 부분 이다.Rx 의 본질은 비동기 함 수 를 봉인 한 다음 에 4 대 행위 로 추상 화 하 는 것 이다.구독 취소,구독 취소,이벤트 발송,완성/이상 이다.
실제 Rx 라 이브 러 리 를 실현 하 는 방법 은 여러 가지 가 있 습 니 다.본 고 는 고급 함수 의 사상 을 이용 하여 Observable 의 본질 을 이해 하도록 도 왔 습 니 다.공식 적 으로 실 현 된 버 전에 서 Observable 이라는 택배 박스 는 고급 함수 가 아니 라 대상 이지 만 본질 적 으로 똑 같 습 니 다.
이상 은 Rx 응답 식 프로 그래 밍 의 상세 한 내용 입 니 다.Rx 응답 식 프로 그래 밍 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【iOS, RxSwift】RxSwift 입문 ~ 옵저버 패턴의 이미지 ~여기에서는 그 이미지를 잡는 것을 목적으로 하고 있습니다. Observable(감시되는 것) Subscribe (구독하는 것) 이벤트 이벤트로서 onNext, onError, onComplete 가 흐릅니다. 기본 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.