1. 소개
이 섹션은 비규범적입니다.
2. 핵심 인프라
2.1. Subscriber
인터페이스
[Exposed=*]interface {
Subscriber undefined next (any );
value undefined error (any );
error undefined complete ();undefined addTeardown (VoidFunction ); // Subscriber가 생성된 후, complete()/error()가 호출되거나 구독자가 구독을 해지할 때까지 true입니다. // complete()/error() 내부에서는 이 속성이 true입니다.
teardown readonly attribute boolean active ;readonly attribute AbortSignal signal ; };
각 Subscriber
는 순서가 지정된
집합의 내부 옵저버를 가지며, 초기값은 비어있습니다.
각 Subscriber
는 teardown 콜백을 가지며, 이는 리스트 형태의 VoidFunction
들로
초기값은 비어있습니다.
각 Subscriber
는 구독 컨트롤러를 가지며, 이는 AbortController
입니다.
각 Subscriber
는 active 불리언 값을 가지며, 초기값은 true입니다.
참고: 이 값은 Subscriber가 종료된 이후에는 자신이 소유한 콜백을 절대 호출하지 않도록 보장하는 변수입니다.
active
getter 단계는 this의 active 불리언 값을 반환합니다.
signal
getter 단계는 this의 구독 컨트롤러의
signal을 반환합니다.
next(value)
메서드 단계:
-
this의 관련 글로벌 객체가
Window
객체이고, 그 연관된 Document가 완전히 활성화되어 있지 않으면 return합니다.
error(error)
메서드 단계:
complete()
메서드 단계:
addTeardown(teardown)
메서드 단계:
Subscriber
subscriber와 선택적 any
reason에 대해 실행하는 단계:
-
subscriber의 active가 false이면 return합니다.
이 단계는 재진입 호출을 방지합니다. "producer-initiated" 구독 해지의 경우 다음 예시처럼 동작할 수 있습니다:
const outerController= new AbortController(); const observable= new Observable( subscriber=> { subscriber. addTeardown(() => { // 2.) 이 teardown은 "구독 종료" 알고리즘 내부에서 실행되며, 실행 중에 다운스트림 시그널의 abort 알고리즘을 실행합니다. 그 중 하나가 현재 실행 중인 "구독 종료" 알고리즘입니다. outerController. abort(); }); // 1.) 이 호출은 즉시 "구독 종료" 알고리즘을 실행하며, subscriber.active를 false로 설정합니다. subscriber. complete(); }); observable. subscribe({}, { signal: outerController. signal}); -
subscriber의 active 불리언 값을 false로 설정합니다.
-
각 teardown에 대해 subscriber의 teardown 콜백들을 역순으로 정렬하여 순회합니다:
-
subscriber의 관련 글로벌 객체가
Document
객체이고, 그 연관된 Document가 완전히 활성화되어 있지 않으면 해당 단계들을 중단합니다.참고: 각 teardown에서 Document가 비활성 상태가 될 수 있기 때문에 해당 단계가 반복 실행될 수 있습니다.
-
invoke teardown을 «»와 "
report
"를 인자로 실행합니다.
-
2.2. Observable
인터페이스
// SubscribeCallback은 Observable "생성자"의 코드가 들어있는 곳입니다. // subscribe()가 호출될 때 호출되어 새로운 구독을 설정합니다.callback =
SubscribeCallback undefined (Subscriber );
subscriber callback =
ObservableSubscriptionCallback undefined (any );
value dictionary {
SubscriptionObserver ObservableSubscriptionCallback ;
next ObservableSubscriptionCallback ;
error VoidFunction ; };
complete callback =
ObservableInspectorAbortHandler undefined (any );
value dictionary {
ObservableInspector ObservableSubscriptionCallback ;
next ObservableSubscriptionCallback ;
error VoidFunction ;
complete VoidFunction ;
subscribe ObservableInspectorAbortHandler ; };
abort typedef (ObservableSubscriptionCallback or SubscriptionObserver );
ObserverUnion typedef (ObservableSubscriptionCallback or ObservableInspector );
ObservableInspectorUnion dictionary {
SubscribeOptions AbortSignal ; };
signal callback =
Predicate boolean (any ,
value unsigned long long );
index callback =
Reducer any (any ,
accumulator any ,
currentValue unsigned long long );
index callback =
Mapper any (any ,
value unsigned long long ); // Mapper와 다른 점은 반환 타입뿐이며, 이 콜백은 시퀀스의 각 요소를 방문할 때만 사용됩니다.
index callback =
Visitor undefined (any ,
value unsigned long long ); // 이 콜백은 `any`를 반환하며, 이는 `Observable`로 변환되어야 합니다. 변환 방식은 Observable 변환 규칙을 따릅니다.
index callback =
CatchCallback any (any ); [Exposed=*]
value interface {
Observable constructor (SubscribeCallback );
callback undefined subscribe (optional ObserverUnion = {},
observer optional SubscribeOptions = {}); // value가 다음 중 하나일 경우, 네이티브 Observable을 생성합니다: // - Observable // - AsyncIterable // - Iterable // - Promise
options static Observable from (any ); // Observable 반환 연산자. 연산자에 대한 자세한 내용은 "Operators" 섹션을 참조하세요. // // takeUntil()은 promise, iterable, async iterable, 다른 observable을 소비할 수 있습니다.
value Observable takeUntil (any );
value Observable map (Mapper );
mapper Observable filter (Predicate );
predicate Observable take (unsigned long long );
amount Observable drop (unsigned long long );
amount Observable flatMap (Mapper );
mapper Observable switchMap (Mapper );
mapper Observable inspect (optional ObservableInspectorUnion = {});
inspectorUnion Observable catch (CatchCallback );
callback Observable finally (VoidFunction ); // Promise 반환 연산자.
callback Promise <sequence <any >>toArray (optional SubscribeOptions = {});
options Promise <undefined >forEach (Visitor ,
callback optional SubscribeOptions = {});
options Promise <boolean >every (Predicate ,
predicate optional SubscribeOptions = {});
options Promise <any >first (optional SubscribeOptions = {});
options Promise <any >last (optional SubscribeOptions = {});
options Promise <any >find (Predicate ,
predicate optional SubscribeOptions = {});
options Promise <boolean >some (Predicate ,
predicate optional SubscribeOptions = {});
options Promise <any >reduce (Reducer ,
reducer optional any ,
initialValue optional SubscribeOptions = {}); };
options
각 Observable
는 subscribe 콜백을 가지며, 이는 SubscribeCallback
또는 Subscriber
를
받는 일련의 단계입니다.
각 Observable
는 weak subscriber를 가지며, 이는 Subscriber
의
약한 참조 또는 null이며, 초기값은 null입니다.
참고: 이 타입들의 "union"은 JavaScript로 생성된 Observable
(항상 SubscribeCallback
으로
생성됨)과 네이티브로 생성된 Observable
(subscribe 콜백이 자바스크립트 콜백이 아니라 네이티브 단계일 수 있음)을 모두 지원하기 위한 것입니다. when()
의
반환값이 후자의 예시입니다.
new
Observable(callback)
생성자 단계:
-
this의 subscribe 콜백을 callback으로 설정합니다.
참고: 이 콜백은 나중에
subscribe()
가 호출될 때 실행됩니다.
subscribe(observer, options)
메서드 단계:
-
Observable 구독을 this에 대해 observer와 options로 실행합니다.
2.2.1. 지원 개념
any
error를 받아 다음 단계들을 실행하는 알고리즘입니다:
참고: 이 기본 알고리즘을 별도로 분리한 이유는, 명세에서 네이티브로 Observable에 구독할 때(즉, 명세에서 직접 구독하는 경우, subscribe()
메서드를 거치지 않는 경우) 중복으로 이 단계를 정의할 필요가 없기 때문입니다.
내부 옵저버는 다음 구조체의 항목을 가진 구조체입니다:
- next 단계
-
하나의
any
타입 파라미터를 받는 알고리즘입니다. 초기에는 아무 동작도 하지 않습니다. - error 단계
-
하나의
any
타입 파라미터를 받는 알고리즘입니다. 초기값은 기본 오류 알고리즘입니다. - complete 단계
-
파라미터가 없는 알고리즘입니다. 초기에는 아무 동작도 하지 않습니다.
내부 옵저버 구조체는
next
,
error
,
complete
콜백 함수를 거울처럼 반영하는 데 사용됩니다. 자바스크립트를 통해 Observable
에 subscribe()
메서드로 구독할 때,
이러한 알고리즘 "단계"는 스크립트에서 제공된 콜백 함수 호출을 감싸는 래퍼입니다.
하지만 명세 내 프로즈(사용자 스크립트가 아님)에서 Observable에 구독할 때는, 이 "단계"들은 ObserverUnion
에 Web IDL 콜백 함수로 제공되는 것이 아니라 임의의 명세 알고리즘입니다. 예시로 § 2.3.3 Promise 반환 연산자에서 사용합니다.
any
value를 받아 다음 단계들을 실행합니다:
참고: 이 알고리즘은 Web IDL의 from()
메서드와 분리되어 명세 프로즈에서 Web IDL 바인딩을 거치지 않고 값을 변환할 수 있도록 합니다.
-
Type(value)이 Object가 아니면, TypeError를 발생시킵니다.
참고: 이는 원시 타입이 Iterable로 강제 변환되는 것을 방지합니다(예: String). 자세한 내용은 WICG/observable#125를 참고하세요.
-
Observable에서 변환: value의 특정 타입이
Observable
이면, value를 반환합니다. -
비동기 iterable에서 변환: asyncIteratorMethod를 ? GetMethod(value,
%Symbol.asyncIterator%
)로 설정합니다.참고: 여기서는 GetMethod를 사용합니다. GetIterator는 (a) 프로토콜 미구현, (b) 프로토콜은 있지만 호출 불가/게터 예외 등 두 경우 모두 예외를 발생시키지만, GetMethod는 두 번째 경우에만 예외를 발생시킵니다.
-
asyncIteratorMethod가 undefined 또는 null이면 Iterable에서 변환 단계로 이동합니다.
-
nextAlgorithm을 다음 단계로 설정합니다. (
Subscriber
subscriber, Iterator Record iteratorRecord를 받음):-
nextPromise를
Promise
또는 undefined로 초기화합니다. -
nextCompletion을 IteratorNext(iteratorRecord)로 설정합니다.
참고: 여기서는 IteratorNext를 사용합니다. 비동기 iterator의 next()가 Promise/thenable을 반환하는 경우를 처리하기 위함입니다.
-
nextCompletion이 throw completion이면:
-
단언: iteratorRecord의 [[Done]]이 true임을 확인합니다.
-
nextPromise를 거부된 promise로 설정합니다.
-
-
그 외 nextRecord가 normal completion이면 nextPromise를 nextRecord의 [[Value]]로 해결된 promise로 설정합니다.
참고: nextRecord의 [[Value]]가 이미
Promise
가 아니더라도 wrapping을 보장합니다. -
-
nextPromise가 iteratorResult로 fulfill되면:
-
Type(iteratorResult) 이 Object가 아니면 subscriber의
error()
메서드를TypeError
로 실행하고 중단합니다. -
done을 IteratorComplete(iteratorResult)로 설정합니다.
-
done이 throw completion이면 subscriber의
error()
메서드를 done의 [[Value]]로 실행하고 중단합니다. -
done의 [[Value]]가 true이면 subscriber의
complete()
를 실행하고 중단합니다. -
value를 IteratorValue(iteratorResult)로 설정합니다.
-
value가 throw completion이면 subscriber의
error()
메서드를 value의 [[Value]]로 실행하고 중단합니다. -
subscriber의
next()
를 value의 [[Value]]로 실행합니다. -
nextAlgorithm을 subscriber와 iteratorRecord로 재실행합니다.
-
-
nextPromise가 r로 reject되면, subscriber의
error()
를 r로 실행합니다.
-
-
새로운
Observable
을 반환합니다. 그 subscribe 콜백은Subscriber
subscriber를 받아 다음을 수행합니다:-
iteratorRecordCompletion을 GetIterator(value, async)로 설정합니다.
참고: 이는
%Symbol.asyncIterator%
getter를 다시 호출할 수 있으며 corner case지만 테스트 기대치와 일치합니다. 자세한 논의는 issue#127 참고. -
iteratorRecordCompletion이 throw completion이면 subscriber의
error()
메서드를 iteratorRecordCompletion의 [[Value]]로 실행하고 중단합니다.참고: 이 경우에만 비동기 iterable이 Observable로 변환될 때 구독 시작 시 동기적으로 오류가 보고됩니다. 그 외에는 오류가 마이크로태스크 타이밍으로 비동기적으로 옵저버에 전달됩니다. 이는 for-await-of loop와 동일한 동작입니다.
-
iteratorRecord를 ! iteratorRecordCompletion로 설정합니다.
-
단언: iteratorRecord가 Iterator Record임을 확인합니다.
-
다음 abort 알고리즘을 subscriber의 구독 컨트롤러의 signal에 추가합니다:
-
AsyncIteratorClose(iteratorRecord, NormalCompletion(subscriber의 구독 컨트롤러의 abort reason)).
-
-
nextAlgorithm을 subscriber와 iteratorRecord로 실행합니다.
-
Iterable에서 변환: iteratorMethod를 ? GetMethod(value,
%Symbol.iterator%
)로 설정합니다. -
iteratorMethod가 undefined면 Promise에서 변환 단계로 이동합니다.
그 외에는 새로운
Observable
을 반환합니다. 그 subscribe 콜백은Subscriber
subscriber를 받아 다음을 수행합니다:-
iteratorRecordCompletion을 GetIterator(value, sync)로 설정합니다.
-
iteratorRecordCompletion이 throw completion이면 subscriber의
error()
메서드를 iteratorRecordCompletion의 [[Value]]로 실행하고 중단합니다. -
iteratorRecord를 ! iteratorRecordCompletion로 설정합니다.
-
다음 abort 알고리즘을 subscriber의 구독 컨트롤러의 signal에 추가합니다:
-
IteratorClose(iteratorRecord, NormalCompletion(UNUSED)).
-
-
반복 true 동안:
-
next를 IteratorStepValue(iteratorRecord)로 설정합니다.
-
next가 throw completion이면 subscriber의
error()
메서드를 next의 [[Value]]로 실행하고 break합니다. -
next를 !로 변환합니다.
-
next가 done이면:
-
단언: iteratorRecord의 [[Done]]이 true임을 확인합니다.
-
subscriber의
complete()
를 실행합니다. -
return합니다.
-
-
subscriber의
next()
를 next로 실행합니다.
-
-
Promise에서 변환: IsPromise(value)가 true라면:
-
새로운
Observable
을 반환합니다. 그 subscribe 콜백은Subscriber
subscriber를 받아 다음을 수행합니다:-
-
value가 v로 fulfill되면:
-
subscriber의
next()
를 v로 실행합니다. -
subscriber의
complete()
를 실행합니다.
-
-
value가 r로 reject되면 subscriber의
error()
를 r로 실행합니다.
-
-
-
-
TypeError를 발생시킵니다.
Observable
에
구독하려면,
ObserverUnion
또는 내부 옵저버
observer와 SubscribeOptions
options가 주어졌을 때 다음 단계를 실행합니다:
참고: 이 알고리즘은 Web IDL의 subscribe()
메서드와 분리되어 명세 프로즈에서 Web IDL 바인딩을 거치지 않고 Observable
에
직접 구독할 수 있습니다. w3c/IntersectionObserver#464를
참고하세요. "internal" prose는 JavaScript에서 속성이 변경될 수 있는 객체에 대해 Web IDL 바인딩을 거치지 않아야 합니다. 사용 예시는 § 2.3.3 Promise 반환 연산자에서 확인할 수 있습니다.
-
this의 관련 글로벌 객체가
Window
객체이고, 그 연관된 Document가 완전히 활성화되어 있지 않으면 return합니다. -
internal observer를 새로운 내부 옵저버로 설정합니다.
-
observer를 다음 방식으로 처리합니다:
-
- observer가
ObservableSubscriptionCallback
인 경우 -
internal observer의 next 단계를 다음 단계로 설정합니다.
any
value를 받음:-
invoke observer를 «value»와 "
report
"로 실행합니다.
-
- observer가
SubscriptionObserver
인 경우 - observer가 내부 옵저버인 경우
- internal observer를 observer로 설정합니다.
- observer가
-
-
단언: internal observer의 error 단계는 기본 오류 알고리즘이거나, 제공된
error
콜백 함수를 호출하는 알고리즘임을 확인합니다. -
this의 weak subscriber가 null이 아니고, this의 weak subscriber의 active가 true라면:
-
subscriber를 this의 weak subscriber로 설정합니다.
-
internal observer를 subscriber의 내부 옵저버에 추가합니다.
-
-
options의
signal
이 aborted이면, internal observer를 subscriber의 내부 옵저버에서 제거합니다. -
그 외에는 아래 abort 알고리즘을 options의
signal
에 추가합니다:-
subscriber의 active 가 false이면 중단합니다.
-
internal observer를 subscriber의 내부 옵저버에서 제거합니다.
-
subscriber의 내부 옵저버가 비어있으면, subscriber 종료를 options의
signal
의 abort reason으로 실행합니다.
-
-
-
return합니다.
-
-
subscriber를 새로운
Subscriber
로 생성합니다. -
internal observer를 subscriber의 내부 옵저버에 추가합니다.
-
this의 weak subscriber를 subscriber로 설정합니다.
-
-
options의
signal
이 aborted면, subscriber 종료를 options의signal
의 abort reason으로 실행합니다. -
그 외에는 아래 abort 알고리즘을 options의
signal
에 추가합니다:-
subscriber의 active가 false이면 중단합니다.
-
internal observer를 subscriber의 내부 옵저버에서 제거합니다.
-
subscriber의 내부 옵저버가 비어있으면, subscriber 종료를 options의
signal
의 abort reason으로 실행합니다.
-
-
-
this의 subscribe 콜백이
SubscribeCallback
이면, invoke를 «subscriber»와 "rethrow
"로 실행합니다. -
그 외에는 this의 subscribe 콜백이 제공하는 단계를 subscriber로 실행합니다.
2.3. 연산자
현재는 https://github.com/wicg/observable#operators를 참고하세요.
2.3.1. from()
from(value)
메서드 단계:
-
value를 Observable로 변환한 결과를 반환합니다. 예외가 발생하면 다시 던집니다.
2.3.2.
Observable
반환 연산자
takeUntil(value)
메서드 단계:
-
sourceObservable을 this로 설정합니다.
-
notifier를 value를 Observable로 변환한 결과로 설정합니다.
-
observable을 새로운
Observable
로 설정합니다. subscribe 콜백은Subscriber
subscriber를 받아 다음을 실행합니다:이 메서드는 두 개의Observable
에 구독하는 동작이 포함됩니다: (1) notifier, (2) sourceObservable. 다음 상황에서는 둘 다 "구독 해지"됩니다:-
notifier가 값을(“next” 또는 “error”) 내보내기 시작하면, notifier의 구독을 해지합니다. 더 이상 값이 필요하지 않으므로 계속 값을 생산할 필요가 없습니다. sourceObservable의 구독도 해지합니다. notifier가 값을 내보냈으므로 observable의 구독을 수동으로 종료하기 때문입니다.
-
sourceObservable이
error()
또는complete()
를 실행하면, notifier에 더 이상 관심이 없으므로 구독을 해지합니다. sourceObservable의 구독 해지는 필요하지 않습니다(스스로 완료됨).
-
notifierObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
subscriber의
complete()
를 실행합니다.참고: 이것은 sourceObservable에 이미 구독되어 있다면 구독을 해지합니다. 왜냐하면 sourceObservable은 "외부" subscriber의 구독 컨트롤러의 signal로 구독되고, 위에서 subscriber의
complete()
를 실행하면 signal이 abort되어 구독이 종료됩니다. - error 단계
-
subscriber의
complete()
를 실행합니다.
참고: notifier
Observable
이 자체적으로 완료되는 경우에는 observable의 subscriber를 완료할 필요가 없습니다. observable은 sourceObservable을 계속 미러링합니다. -
options를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
notifier에 notifierObserver와 options로 구독합니다.
-
subscriber의 active가 false면 return합니다.
참고: notifier가 동기적으로 값을 내보내면 sourceObservable의 subscribe 콜백은 아예 실행되지 않습니다. 동기적으로 "complete"만 하면 subscriber의 active는 여전히 true이므로 sourceObservable에 구독이 진행됩니다.
-
sourceObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
전달된 value로 subscriber의
next()
를 실행합니다. - error 단계
-
전달된 error로 subscriber의
error()
를 실행합니다. - complete 단계
-
subscriber의
complete()
를 실행합니다.
참고: sourceObserver는 대부분 패스스루 역할로 sourceObservable의 모든 이벤트를 미러링합니다. 단, sourceObservable이 먼저 종료되면 notifier의 구독을 해지합니다.
-
sourceObservable에 sourceObserver와 options로 구독합니다.
-
-
observable을 반환합니다.
map(mapper)
메서드 단계:
-
sourceObservable을 this로 설정합니다.
-
observable을 새로운
Observable
로 설정합니다. subscribe 콜백은Subscriber
subscriber를 받아 다음을 실행합니다:-
idx를
unsigned long long
으로 설정하며, 초기값은 0입니다. -
sourceObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
- error 단계
-
subscriber의
error()
를 넘겨받은 error로 실행합니다. - complete 단계
-
subscriber의
complete()
를 실행합니다.
-
options를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
sourceObservable에 sourceObserver와 options로 구독합니다.
-
-
observable을 반환합니다.
filter(predicate)
메서드 단계:
-
sourceObservable을 this로 설정합니다.
-
observable을 새로운
Observable
로 설정합니다. subscribe 콜백은Subscriber
subscriber를 받아 다음을 실행합니다:-
idx를
unsigned long long
으로 설정하며, 초기값은 0입니다. -
sourceObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
- error 단계
-
subscriber의
error()
를 넘겨받은 error로 실행합니다. - complete 단계
-
subscriber의
complete()
를 실행합니다.
-
options를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
sourceObservable에 sourceObserver와 options로 구독합니다.
-
-
observable을 반환합니다.
take(amount)
메서드 단계:
-
sourceObservable을 this로 설정합니다.
-
observable을 새로운
Observable
로 설정합니다. subscribe 콜백은Subscriber
subscriber를 받아 다음을 실행합니다:-
remaining을 amount로 설정합니다.
-
remaining이 0이면, subscriber의
complete()
를 실행하고 중단합니다. -
sourceObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
-
넘겨받은 value로 subscriber의
next()
를 실행합니다. -
remaining을 1 감소시킵니다.
-
remaining이 0이면, subscriber의
complete()
를 실행합니다.
-
- error 단계
-
넘겨받은 error로 subscriber의
error()
를 실행합니다. - complete 단계
-
subscriber의
complete()
를 실행합니다.
-
options를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
sourceObservable에 sourceObserver와 options로 구독합니다.
-
-
observable을 반환합니다.
drop(amount)
메서드 단계:
-
sourceObservable을 this로 설정합니다.
-
observable을 새로운
Observable
로 설정합니다. subscribe 콜백은Subscriber
subscriber를 받아 다음을 실행합니다:-
remaining을 amount로 설정합니다.
-
sourceObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
- error 단계
-
넘겨받은 error로 subscriber의
error()
를 실행합니다. - complete 단계
-
subscriber의
complete()
를 실행합니다.
-
options를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
sourceObservable에 sourceObserver와 options로 구독합니다.
-
-
observable을 반환합니다.
flatMap(mapper)
메서드 단계:
-
sourceObservable을 this로 설정합니다.
-
observable을 새로운
Observable
로 설정합니다. subscribe 콜백은Subscriber
subscriber를 받아 다음을 실행합니다:-
idx를
unsigned long long
으로 설정하며, 초기값은 0입니다. -
outerSubscriptionHasCompleted를 boolean으로 설정하며, 초기값은 false입니다.
-
queue를
any
값의 리스트로 초기값은 비어있습니다.참고: 이 queue는 sourceObservable에서 내보낸
Observable
을 임시로 저장하는 데 사용됩니다. observable이 이전에 내보낸Observable
에 아직 구독 중일 경우, 새로 내보낸 Observable들은 queue에 저장됩니다. -
activeInnerSubscription을 boolean으로 초기값 false로 설정합니다.
-
sourceObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
-
activeInnerSubscription이 true라면:
-
queue에 value를 append합니다.
참고: 이 value는 현재 구독 중인 Observable이 끝난 후에 처리됩니다.
-
-
그 외의 경우:
-
activeInnerSubscription을 true로 설정합니다.
-
flatmap process next value steps를 value, subscriber, mapper, 그리고 참조로 queue, activeInnerSubscription, outerSubscriptionHasCompleted, idx로 실행합니다.
참고: flatmap process next value steps는 value에서 파생된
Observable
에 구독하고, 그 구독이 비활성(완료 또는 오류)될 때까지 값을 계속 처리합니다. "inner" Observable이 완료되면, 큐의 다음 값을 재귀적으로 처리합니다.큐에 값이 없다면, activeInnerSubscription을 false로 만들고, 이후 값이 올 때 적절하게 처리할 수 있게 합니다.
-
-
- error 단계
-
넘겨받은 error로 subscriber의
error()
를 실행합니다. - complete 단계
-
-
outerSubscriptionHasCompleted을 true로 설정합니다.
참고: activeInnerSubscription이 true라면 아래 단계에서 subscriber를 완료하지 않습니다. 이 경우, flatmap process next value steps가 큐가 비었을 때 subscriber를 완료합니다.
-
activeInnerSubscription이 false이고 queue가 비었으면, subscriber의
complete()
를 실행합니다.
-
-
options를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
sourceObservable에 sourceObserver와 options로 구독합니다.
-
-
observable을 반환합니다.
any
value, Subscriber
subscriber, Mapper
mapper, 그리고 참조로 리스트 queue, activeInnerSubscription, outerSubscriptionHasCompleted, unsigned long long
idx를 받아 실행하는 단계:
-
mappedResult를 mapper를 «value, idx»와 "
rethrow
"로 실행한 결과로 설정합니다. -
idx를 idx + 1로 설정합니다.
-
innerObservable을
from()
에 mappedResult를 넣어 호출한 결과로 설정합니다.예외 E가 발생하면 subscriber의
error()
를 E로 실행하고, 중단합니다.from()
을 직접 호출하지 말고, 예외 처리를 우리가 직접 할 수 있는 내부 알고리즘을 사용해야 합니다. 예외를 subscriber에게 전달하고 싶기 때문입니다. -
innerObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
넘겨받은 value로 subscriber의
next()
를 실행합니다. - error 단계
-
넘겨받은 error로 subscriber의
error()
를 실행합니다. - complete 단계
-
-
queue가 비어있지 않으면:
-
nextValue를 queue의 첫 번째 아이템으로 설정하고, queue에서 삭제합니다.
-
flatmap process next value steps를 nextValue, subscriber, mapper, 그리고 참조로 queue, activeInnerSubscription로 실행합니다.
-
-
그 외의 경우:
-
activeInnerSubscription을 false로 설정합니다.
참고: activeInnerSubscription이 참조이므로, "outer"
Observable
(sourceObservable)에서 이후 내보내는 값들이 정상적으로 처리될 수 있습니다. -
outerSubscriptionHasCompleted이 true라면 subscriber의
complete()
를 실행합니다.참고: "outer"
Observable
이 이미 완료되었지만, 아직 대기 중인 "inner"Observable
이 남아있었기 때문에 바로 subscriber를 완료하지 않았던 상황입니다. 지금 완료합니다.
-
-
-
innerOptions를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
innerObservable에 innerObserver와 innerOptions로 구독합니다.
switchMap(mapper)
메서드 단계:
-
sourceObservable을 this로 설정합니다.
-
observable을 새로운
Observable
로 설정합니다. subscribe 콜백은Subscriber
subscriber를 받아 다음을 실행합니다:-
idx를
unsigned long long
으로 설정하며, 초기값은 0입니다. -
outerSubscriptionHasCompleted를 boolean으로 초기값 false로 설정합니다.
-
activeInnerAbortController를
AbortController
또는 null로 초기값 null로 설정합니다.참고: 이
AbortController
는 아래 next 단계에서 새로 생성되고, switchmap process next value steps에서 null로 변경됩니다. 현재 "inner" 구독이 활성 상태인지 여부를 나타냅니다. complete 단계에서 만약 "inner" 구독 중이면 subscriber를 즉시 완료하지 않고, "inner" 구독이 끝날 때까지 대기합니다. -
sourceObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
-
- next 단계
-
-
activeInnerAbortController가 null이 아니면, abort 시그널을 activeInnerAbortController에 보냅니다.
참고: 이전 값에서 파생된 "inner"
Observable
의 구독을 해지하고, 새 값에서 파생된Observable
에 바로 구독합니다. -
activeInnerAbortController를 새로운
AbortController
로 설정합니다. -
switchmap process next value steps를 value, subscriber, mapper, 그리고 참조로 activeInnerAbortController, outerSubscriptionHasCompleted, idx로 실행합니다.
참고: switchmap process next value steps는 value에서 파생된
Observable
에 구독하고, 구독이 비활성(완료 또는 오류)되거나 activeInnerAbortController가 abort되면 구독을 종료합니다. sourceObservable이 새 값을 내보내면 이전 "inner" 구독을 abort하고 새 값에서 파생된 "inner" 구독을 시작합니다.
-
- error 단계
-
넘겨받은 error로 subscriber의
error()
를 실행합니다. -
- complete 단계
-
-
outerSubscriptionHasCompleted를 true로 설정합니다.
참고: activeInnerAbortController가 null이 아니면 subscriber를 바로 완료하지 않고, "inner" 구독이 완료될 때까지 대기합니다.
-
activeInnerAbortController가 null이면 subscriber의
complete()
를 실행합니다.
-
-
-
options를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
sourceObservable에 sourceObserver와 options로 구독합니다.
-
-
observable을 반환합니다.
any
value, Subscriber
subscriber, Mapper
mapper, 그리고 다음의 참조: AbortController
activeInnerAbortController, boolean
outerSubscriptionHasCompleted,
unsigned long long
idx에 대해 다음 단계를 실행합니다:
-
mappedResult를 mapper를 «value, idx»와 "
rethrow
"로 실행한 결과로 설정합니다. -
idx를 idx + 1로 설정합니다.
-
innerObservable을
from()
에 mappedResult를 넣어 호출한 결과로 설정합니다. -
innerObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
넘겨받은 value로 subscriber의
next()
를 실행합니다. - error 단계
-
넘겨받은 error로 subscriber의
error()
를 실행합니다.참고: activeInnerAbortController를 여기서 null로 설정할 필요는 없습니다. subscriber의
error()
를 호출하면 이미 "outer" 소스 Observable의 구독이 해지되므로 더 이상 값을 푸시하지 않습니다. - complete 단계
-
-
outerSubscriptionHasCompleted이 true라면 subscriber의
complete()
를 실행합니다. -
그 외에는 activeInnerAbortController를 null로 설정합니다.
참고: 이 변수는 참조이므로 switchMap complete 단계에 현재 활성 inner 구독이 없음을 알립니다.
-
-
innerOptions를 새로운
SubscribeOptions
로 설정하며,signal
은 다음 리스트로 의존적 abort 시그널 생성 알고리즘을 사용합니다: «activeInnerAbortController의 signal, subscriber의 구독 컨트롤러의 signal»,AbortSignal
, 현재 realm. -
innerObservable에 innerObserver와 innerOptions로 구독합니다.
inspect(inspectorUnion)
메서드 단계:
-
subscribe callback을
VoidFunction
또는 null로, 초기값은 null로 설정합니다. -
next callback을
ObservableSubscriptionCallback
또는 null로, 초기값은 null로 설정합니다. -
error callback을
ObservableSubscriptionCallback
또는 null로, 초기값은 null로 설정합니다. -
complete callback을
VoidFunction
또는 null로, 초기값은 null로 설정합니다. -
abort callback을
ObservableInspectorAbortHandler
또는 null로, 초기값은 null로 설정합니다. -
inspectorUnion을 다음 방식으로 처리합니다:
- inspectorUnion이
ObservableSubscriptionCallback
이면 -
-
next callback을 inspectorUnion으로 설정합니다.
-
- inspectorUnion이
ObservableInspector
이면
- inspectorUnion이
-
sourceObservable을 this로 설정합니다.
-
observable을 새로운
Observable
로 설정합니다. subscribe 콜백은Subscriber
subscriber를 받아 다음을 실행합니다:-
subscribe callback이 null이 아니면 invoke를 «»와 "
rethrow
"로 실행합니다.예외 E가 발생하면 subscriber의
error()
를 E로 실행하고, 중단합니다.참고: 이 결과로 sourceObservable은 구독되지 않습니다.
-
abort callback이 null이 아니면 아래 abort 알고리즘을 subscriber의 구독 컨트롤러의 signal에 추가합니다:
-
invoke abort callback을 «subscriber의 구독 컨트롤러의 signal의 abort reason»와 "
report
"로 실행합니다.
-
-
sourceObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
-
next callback이 null이 아니면 invoke를 «넘겨받은 value»와 "
rethrow
"로 실행합니다.예외 E가 발생하면:
-
abort callback을 subscriber의 구독 컨트롤러의 signal에서 제거합니다.
참고: 이 단계는 중요합니다. abort callback은 소비자에 의해 시작된 구독 해지에만 호출되어야 합니다. 아래와 같이 프로듀서가 subscriber의
error()
또는complete()
메서드를 통해 구독을 종료하는 경우에는 abort callback이 실행되지 않도록 해야 합니다.이는 Chromium의 구현과 동일하지만, 처음 전달된
SubscribeOptions
의signal
참조를 들고 있다가 abort될 때만 abort callback을 실행해도 결과는 같으니, 확인 필요. -
subscriber의
error()
를 E로 실행하고, 중단합니다.
-
-
넘겨받은 value로 subscriber의
next()
를 실행합니다.
-
- error 단계
- complete 단계
-
-
abort callback을 subscriber의 구독 컨트롤러의 signal에서 제거합니다.
-
complete callback이 null이 아니면 invoke를 «»와 "
rethrow
"로 실행합니다. -
subscriber의
complete()
를 실행합니다.
-
-
options를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
sourceObservable에 sourceObserver와 options로 구독합니다.
-
-
observable을 반환합니다.
catch(callback)
메서드 단계:
-
sourceObservable을 this로 설정합니다.
-
observable을 새로운
Observable
로 설정합니다. subscribe 콜백은Subscriber
subscriber를 받아 다음을 실행합니다:-
sourceObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
넘겨받은 value로 subscriber의
next()
를 실행합니다. - error 단계
-
-
callback을 «넘겨받은 error»와 "
rethrow
"로 실행합니다. 반환값을 result로 합니다. -
innerObservable을
from()
에 result를 넣어 호출한 결과로 설정합니다.예외 E가 발생하면, subscriber의
error()
를 E로 실행하고, 중단합니다.from()
을 직접 호출하지 말고, 예외 처리를 직접 할 수 있는 내부 알고리즘을 사용해야 합니다. 예외를 subscriber에게 전달하고 싶기 때문입니다. -
innerObserver를 새로운 내부 옵저버로 생성하고 다음과 같이 초기화합니다:
- next 단계
-
넘겨받은 value로 subscriber의
next()
를 실행합니다. - error 단계
-
넘겨받은 error로 subscriber의
error()
를 실행합니다. - complete 단계
-
subscriber의
complete()
를 실행합니다.
-
innerOptions를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
innerObservable에 innerObserver와 innerOptions로 구독합니다.
참고: innerObservable에 안전하게 구독할 수 있습니다. sourceObservable에서 더 이상 값이 발생하지 않으므로, innerObservable로 안전하게 값을 전환할 수 있습니다.
-
- complete 단계
-
subscriber의
complete()
를 실행합니다.
-
options를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
sourceObservable에 sourceObserver와 options로 구독합니다.
-
-
observable을 반환합니다.
finally(callback)
메서드 단계:
-
sourceObservable을 this로 설정합니다.
-
observable을 새로운
Observable
로 설정합니다. subscribe 콜백은Subscriber
subscriber를 받아 다음을 실행합니다:-
subscriber의
addTeardown()
에 callback을 전달하여 실행합니다. -
sourceObserver를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
넘겨받은 value로 subscriber의
next()
를 실행합니다. - error 단계
-
-
넘겨받은 error로 subscriber의
error()
를 실행합니다.
-
- complete 단계
-
-
subscriber의
complete()
를 실행합니다.
-
-
options를 새로운
SubscribeOptions
로 설정하고,signal
은 subscriber의 구독 컨트롤러의 signal로 설정합니다. -
sourceObservable에 sourceObserver와 options로 구독합니다.
-
-
observable을 반환합니다.
2.3.3.
Promise
반환 연산자
toArray(options)
메서드 단계:
-
p를 새로운 promise로 설정합니다.
-
options의
signal
이 null이 아니면:-
-
p를 options의
signal
의 abort reason으로 거부합니다. -
p를 반환합니다.
-
-
아래 abort 알고리즘을 options의
signal
에 추가합니다:-
p를 options의
signal
의 abort reason으로 거부합니다.
참고: 여기서는 p만 거부하면 됩니다.
Observable
의 구독도 자동으로 종료됩니다. "inner" Subscriber가 close되기 때문입니다. -
-
-
values를 새로운 리스트로 설정합니다.
-
observer를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
-
this에 대해 observer와 options로 구독합니다.
-
p를 반환합니다.
forEach(callback, options)
메서드 단계:
-
p를 새로운 promise로 설정합니다.
-
visitor callback controller를 새로운
AbortController
로 설정합니다. -
internal options를 새로운
SubscribeOptions
로 설정합니다.signal
은 의존적 abort signal 생성 알고리즘으로 «visitor callback controller의 signal, options의signal
(null이 아니면)»을 사용합니다.AbortSignal
, 현재 realm도 사용합니다.많은 단순 내부 옵저버는 패스스루 역할만 하며,
Observable
의 구독을 직접 제어하지 않습니다. 즉, error 단계와 complete 단계는 구독 종료 시 호출되고, next 단계는 값을 그대로 전달합니다.하지만 이 연산자에 대해서는 아래 observer의 next steps가 예외가 발생할 경우 실제로 this에 대한 기반 구독을 중단하는 역할을 합니다. 이런 경우, 우리가 "Observable에 구독" 단계에 전달하는
SubscribeOptions
의signal
은 options의signal
에서 파생된 의존적 signal이어야 하며, 그리고 아래 next steps에서 접근할 수 있고 필요할 때 signal abort를 할 수 있는AbortController
의AbortSignal
이어야 합니다. -
internal options의
signal
이 aborted면:-
p를 internal options의
signal
의 abort reason으로 거부합니다. -
p를 반환합니다.
-
-
아래 abort 알고리즘을 internal options의
signal
에 추가합니다:-
p를 internal options의
signal
의 abort reason으로 거부합니다.참고: p의 거부와 internal options의
signal
가 연결되어 있으므로, options의signal
의abort
이벤트가 발생해도, p의 reject 핸들러는 그 후에 실행됩니다.
-
-
idx를
unsigned long long
으로 초기값 0으로 설정합니다. -
observer를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
-
this에 대해 observer와 internal options로 구독합니다.
-
p를 반환합니다.
every(predicate, options)
메서드 단계:
-
p를 새로운 promise로 설정합니다.
-
controller를 새로운
AbortController
로 설정합니다. -
internal options를 새로운
SubscribeOptions
로 설정합니다.signal
은 의존적 abort signal 생성 알고리즘으로 «controller의 signal, options의signal
(null이 아니면)»을 사용합니다.AbortSignal
, 현재 realm도 사용합니다. -
internal options의
signal
이 aborted면:-
p를 internal options의
signal
의 abort reason으로 거부합니다. -
p를 반환합니다.
-
-
아래 abort 알고리즘을 internal options의
signal
에 추가합니다:-
p를 internal options의
signal
의 abort reason으로 거부합니다.
-
-
idx를
unsigned long long
으로 초기값 0으로 설정합니다. -
observer를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
- error 단계
-
넘겨받은 error로 p를 거부합니다.
- complete 단계
-
p를 true로 resolve합니다.
-
this에 대해 observer와 internal options로 구독합니다.
-
p를 반환합니다.
first(options)
메서드 단계:
-
p를 새로운 promise로 설정합니다.
-
controller를 새로운
AbortController
로 설정합니다. -
internal options를 새로운
SubscribeOptions
로 설정합니다.signal
은 의존적 abort signal 생성 알고리즘으로 «controller의 signal, options의signal
(null이 아니면)»을 사용합니다.AbortSignal
및 현재 realm도 사용합니다. -
internal options의
signal
이 aborted면:-
p를 internal options의
signal
의 abort reason으로 거부합니다. -
p를 반환합니다.
-
-
아래 abort 알고리즘을 internal options의
signal
에 추가합니다:-
p를 internal options의
signal
의 abort reason으로 거부합니다.
-
-
internal observer를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
-
p를 넘겨받은 value로 resolve합니다.
-
controller에 abort 신호를 보냅니다.
-
- error 단계
-
넘겨받은 error로 p를 거부합니다.
- complete 단계
-
p를 새로운
RangeError
로 거부합니다.참고: 소스
Observable
이 첫 번째 값을 내보내기 전에 완료될 때만 도달합니다.
-
this에 대해 internal observer와 internal options로 구독합니다.
-
p를 반환합니다.
last(options)
메서드 단계:
-
p를 새로운 promise로 설정합니다.
-
options의
signal
이 null이 아니면:-
-
p를 options의
signal
의 abort reason으로 거부합니다. -
p를 반환합니다.
-
-
아래 abort 알고리즘을 options의
signal
에 추가합니다:-
p를 options의
signal
의 abort reason으로 거부합니다.
-
-
-
lastValue를
any
또는 null로, 초기값은 null로 설정합니다. -
hasLastValue를 boolean으로 초기값 false로 설정합니다.
-
observer를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
-
hasLastValue를 true로 설정합니다.
-
lastValue를 넘겨받은 value로 설정합니다.
-
- error 단계
-
넘겨받은 error로 p를 거부합니다.
- complete 단계
-
-
hasLastValue가 true이면, p를 lastValue로 resolve합니다.
-
그 외에는 p를 새로운
RangeError
로 거부합니다.참고:
first()
의 참고를 보세요.
-
-
-
this에 대해 observer와 options로 구독합니다.
-
p를 반환합니다.
find(predicate, options)
메서드 단계:
-
p를 새로운 promise로 설정합니다.
-
controller를 새로운
AbortController
로 설정합니다. -
internal options를 새로운
SubscribeOptions
로 설정합니다.signal
은 의존적 abort signal 생성 알고리즘으로 «controller의 signal, options의signal
(null이 아니면)»을 사용합니다.AbortSignal
및 현재 realm도 사용합니다. -
internal options의
signal
이 aborted면:-
p를 internal options의
signal
의 abort reason으로 거부합니다. -
p를 반환합니다.
-
-
아래 abort 알고리즘을 internal options의
signal
에 추가합니다:-
p를 internal options의
signal
의 abort reason으로 거부합니다.
-
-
idx를
unsigned long long
으로 초기값 0으로 설정합니다. -
observer를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
-
this에 대해 observer와 internal options로 구독합니다.
-
p를 반환합니다.
some(predicate, options)
메서드 단계:
-
p를 새로운 프라미스로 설정합니다.
-
controller를 새로운
AbortController
로 설정합니다. -
internal options를 새로운
SubscribeOptions
로 설정합니다.signal
은 의존적 abort signal 생성 알고리즘으로 «controller의 signal, options의signal
(null이 아니면)»을 사용합니다.AbortSignal
및 현재 realm도 사용합니다. -
internal options의
signal
이 aborted라면:-
p를 internal options의
signal
의 abort reason으로 거부합니다. -
p를 반환합니다.
-
-
아래 abort 알고리즘을 internal options의
signal
에 추가합니다:-
p를 internal options의
signal
의 abort reason으로 거부합니다.
-
-
idx를
unsigned long long
으로, 초기값 0으로 설정합니다. -
observer를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
- error 단계
-
넘겨받은 error로 p를 거부합니다.
- complete 단계
-
p를 false로 resolve합니다.
-
this에 대해 observer와 internal options로 구독합니다.
-
p를 반환합니다.
reduce(reducer, initialValue, options)
메서드 단계:
-
p를 새로운 프라미스로 설정합니다.
-
controller를 새로운
AbortController
로 설정합니다. -
internal options를 새로운
SubscribeOptions
로 설정합니다.signal
은 의존적 abort signal 생성 알고리즘으로 «controller의 signal, options의signal
(null이 아니면)»을 사용합니다.AbortSignal
및 현재 realm도 사용합니다. -
internal options의
signal
이 aborted라면:-
p를 internal options의
signal
의 abort reason으로 거부합니다. -
p를 반환합니다.
-
-
아래 abort 알고리즘을 internal options의
signal
에 추가합니다:-
p를 internal options의
signal
의 abort reason으로 거부합니다.
-
-
idx를
unsigned long long
으로, 초기값 0으로 설정합니다. -
accumulator를 initialValue가 주어졌다면 그 값으로, 아니면 초기화되지 않은 값으로 설정합니다.
-
observer를 새로운 내부 옵저버로 생성하여 다음과 같이 초기화합니다:
- next 단계
-
-
accumulator가 초기화되지 않았다면(즉, initialValue가 전달되지 않은 경우), accumulator를 넘겨받은 value로 설정하고 idx를 idx+1로 설정한 후 이 단계를 중단합니다.
참고: 이 경우 reducer는 this가 처음 내보내는
currentValue
값을 받지 않습니다. 두 번째 값이 나오면 reducer가 호출되어, 첫 번째 값은accumulator
로, 두 번째 값은currentValue
로 전달됩니다. -
reducer를 «accumulator (accumulator), 넘겨받은 value (currentValue), idx (index)»와 "
rethrow
"로 실행합니다. 반환값을 result로 설정합니다.예외 E가 발생하면 p를 E로 거부하고, controller에 E로 abort 신호를 보냅니다.
-
idx를 idx + 1로 설정합니다.
-
accumulator를 result로 설정합니다.
-
- error 단계
-
넘겨받은 error로 p를 거부합니다.
- complete 단계
-
-
accumulator가 "
unset
"이 아니면 p를 accumulator로 resolve합니다.그 외에는 p를
TypeError
로 거부합니다.
-
-
this에 대해 observer와 internal options로 구독합니다.
-
p를 반환합니다.
3. EventTarget
통합
dictionary {
ObservableEventListenerOptions boolean =
capture false ;boolean ; };
passive partial interface EventTarget {Observable when (DOMString ,
type optional ObservableEventListenerOptions = {}); };
options
when(type, options)
메서드 단계:
-
this의 관련 글로벌 객체가
Window
객체이고, 그 연관된 Document가 완전히 활성화되어 있지 않으면 return합니다. -
event target을 this로 설정합니다.
-
observable을 새로운
Observable
로 생성합니다. 다음과 같이 초기화합니다:- subscribe 콜백
-
Subscriber
subscriber를 받아 다음을 실행하는 알고리즘:-
event target이 null이면 중단합니다.
참고: event target이 구독 시점에 가비지 컬렉션될 수 있음을 나타냅니다.
-
이벤트 리스너 추가 알고리즘을 event target과 다음 이벤트 리스너로 실행합니다:
-
-
observable을 반환합니다.
Subscriber
subscriber와
Event
event를 받아 다음 단계를 실행합니다:
-
subscriber의
next()
메서드를 event로 실행합니다.
4. 보안 및 프라이버시 고려사항
이 내용은 우리 explainer에서 이 명세로 업스트림되고 있으며, 그동안 다음 자료를 참고할 수 있습니다:
5. 감사의 글
Observable
API 설계에 많은 아이디어를 제공해준 Ben Lesh께 특별히 감사드립니다. 웹 플랫폼에 이 기여가 가능하게 된 것은 Ben
Lesh의 오랜 기간 사용자 공간 Observable 코드 유지와 설계 경험 덕분입니다.