이것은보다 인체 공학적이고 종합 가능한 이벤트 처리에 대한 관찰 가능한 API 제안에 대한 설명 자입니다.
EventTarget 통합 이 제안은 더 나은 addEventListener() 가되는 EventTarget 에 .when() 메소드를 추가합니다. 특히 subscribe() 메소드가 호출 될 때 새로운 이벤트 리스너를 대상에 추가하는 새로운 Observable 반환합니다. 관찰 가능한 것은 각 이벤트와 함께 가입자의 next() 핸들러를 호출합니다.
관찰 정보는 이벤트 처리, 필터링 및 종료를 오늘날의 명령 적 버전보다 이해하고 구성하기 쉬운 명시적이고 선언적 인 흐름으로 전환합니다.이 버전은 종종 addEventListener() 및 팔로우하기 어려운 콜백 체인에 중첩 된 호출이 필요합니다.
// Filtering and mapping:
element
. when ( 'click' )
. filter ( ( e ) => e . target . matches ( '.foo' ) )
. map ( ( e ) => ( { x : e . clientX , y : e . clientY } ) )
. subscribe ( { next : handleClickAtPoint } ) ; // Automatic, declarative unsubscription via the takeUntil method:
element . when ( 'mousemove' )
. takeUntil ( document . when ( 'mouseup' ) )
. subscribe ( { next : e => … } ) ;
// Since reduce and some other terminators return promises, they also play
// well with async functions:
await element . when ( 'mousemove' )
. takeUntil ( element . when ( 'mouseup' ) )
. reduce ( ( soFar , e ) => … ) ; // Imperative
const controller = new AbortController ( ) ;
element . addEventListener ( 'mousemove' , e => {
console . log ( e ) ;
element . addEventListener ( 'mouseup' , e => {
controller . abort ( ) ;
} ) ;
} , { signal : controller . signal } ) ; 모든 링크 추적 컨테이너 내에서 클릭을 추적합니다 (예) :
container
. when ( 'click' )
. filter ( ( e ) => e . target . closest ( 'a' ) )
. subscribe ( {
next : ( e ) => {
// …
} ,
} ) ; 마우스가 고정되는 동안 최대 Y 좌표를 찾으십시오 (예) :
const maxY = await element
. when ( 'mousemove' )
. takeUntil ( element . when ( 'mouseup' ) )
. map ( ( e ) => e . clientY )
. reduce ( ( soFar , y ) => Math . max ( soFar , y ) , 0 ) ; 구독 메시지가 연결로 전송되도록 WebSocket 멀티 플렉스하고 사용자가 구독을 취소 할 때 방사되지 않은 메시지가 서버로 전송됩니다.
const socket = new WebSocket ( 'wss://example.com' ) ;
function multiplex ( { startMsg , stopMsg , match } ) {
if ( socket . readyState !== WebSocket . OPEN ) {
return socket
. when ( 'open' )
. flatMap ( ( ) => multiplex ( { startMsg , stopMsg , match } ) ) ;
} else {
socket . send ( JSON . stringify ( startMsg ) ) ;
return socket
. when ( 'message' )
. filter ( match )
. takeUntil ( socket . when ( 'close' ) )
. takeUntil ( socket . when ( 'error' ) )
. map ( ( e ) => JSON . parse ( e . data ) )
. finally ( ( ) => {
socket . send ( JSON . stringify ( stopMsg ) ) ;
} ) ;
}
}
function streamStock ( ticker ) {
return multiplex ( {
startMsg : { ticker , type : 'sub' } ,
stopMsg : { ticker , type : 'unsub' } ,
match : ( data ) => data . ticker === ticker ,
} ) ;
}
const googTrades = streamStock ( 'GOOG' ) ;
const nflxTrades = streamStock ( 'NFLX' ) ;
const googController = new AbortController ( ) ;
googTrades . subscribe ( { next : updateView } , { signal : googController . signal } ) ;
nflxTrades . subscribe ( { next : updateView , ... } ) ;
// And the stream can disconnect later, which
// automatically sends the unsubscription message
// to the server.
googController . abort ( ) ; // Imperative
function multiplex ( { startMsg , stopMsg , match } ) {
const start = ( callback ) => {
const teardowns = [ ] ;
if ( socket . readyState !== WebSocket . OPEN ) {
const openHandler = ( ) => start ( { startMsg , stopMsg , match } ) ( callback ) ;
socket . addEventListener ( 'open' , openHandler ) ;
teardowns . push ( ( ) => {
socket . removeEventListener ( 'open' , openHandler ) ;
} ) ;
} else {
socket . send ( JSON . stringify ( startMsg ) ) ;
const messageHandler = ( e ) => {
const data = JSON . parse ( e . data ) ;
if ( match ( data ) ) {
callback ( data ) ;
}
} ;
socket . addEventListener ( 'message' , messageHandler ) ;
teardowns . push ( ( ) => {
socket . send ( JSON . stringify ( stopMsg ) ) ;
socket . removeEventListener ( 'message' , messageHandler ) ;
} ) ;
}
const finalize = ( ) => {
teardowns . forEach ( ( t ) => t ( ) ) ;
} ;
socket . addEventListener ( 'close' , finalize ) ;
teardowns . push ( ( ) => socket . removeEventListener ( 'close' , finalize ) ) ;
socket . addEventListener ( 'error' , finalize ) ;
teardowns . push ( ( ) => socket . removeEventListener ( 'error' , finalize ) ) ;
return finalize ;
} ;
return start ;
}
function streamStock ( ticker ) {
return multiplex ( {
startMsg : { ticker , type : 'sub' } ,
stopMsg : { ticker , type : 'unsub' } ,
match : ( data ) => data . ticker === ticker ,
} ) ;
}
const googTrades = streamStock ( 'GOOG' ) ;
const nflxTrades = streamStock ( 'NFLX' ) ;
const unsubGoogTrades = googTrades ( updateView ) ;
const unsubNflxTrades = nflxTrades ( updateView ) ;
// And the stream can disconnect later, which
// automatically sends the unsubscription message
// to the server.
unsubGoogTrades ( ) ; 여기서 우리는 비밀 코드와 일치하도록 관찰 가능성을 활용합니다. 이는 앱을 사용하는 동안 사용자가 누락 할 수있는 키 패턴입니다.
const pattern = [
'ArrowUp' ,
'ArrowUp' ,
'ArrowDown' ,
'ArrowDown' ,
'ArrowLeft' ,
'ArrowRight' ,
'ArrowLeft' ,
'ArrowRight' ,
'b' ,
'a' ,
'b' ,
'a' ,
'Enter' ,
] ;
const keys = document . when ( 'keydown' ) . map ( e => e . key ) ;
keys
. flatMap ( firstKey => {
if ( firstKey === pattern [ 0 ] ) {
return keys
. take ( pattern . length - 1 )
. every ( ( k , i ) => k === pattern [ i + 1 ] ) ;
}
} )
. filter ( matched => matched )
. subscribe ( ( ) => console . log ( 'Secret code matched!' ) ) ; const pattern = [ ... ] ;
// Imperative
document . addEventListener ( 'keydown' , e => {
const key = e . key ;
if ( key === pattern [ 0 ] ) {
let i = 1 ;
const handler = ( e ) => {
const nextKey = e . key ;
if ( nextKey !== pattern [ i ++ ] ) {
document . removeEventListener ( 'keydown' , handler )
} else if ( pattern . length === i ) {
console . log ( 'Secret code matched!' ) ;
document . removeEventListener ( 'keydown' , handler )
}
} ;
document . addEventListener ( 'keydown' , handler ) ;
}
} , { once : true } ) ;Observable API 관찰 가능성은 종합 가능하고 반복되는 이벤트를 나타내는 일류 개체입니다. 그것들은 약속과 같지만 여러 이벤트, 특히 EventTarget 통합과 관련하여 콜백을 약속하는 행사입니다. 그들은 될 수 있습니다 :
subscribe() 통해 이벤트 소비에 관심이있는 사람에게 전달되었습니다.Observable.map() 과 같은 연산자에게 공급, 중첩 된 콜백 웹없이 구성 및 변환됩니다. 더 좋은 점은, 이벤트 처리기의 전환은 콜백의 약속보다 더 간단합니다. 관찰 가능성은 플랫폼 및 사용자 정의 스크립트에서 이벤트를 구독하는 사실상의 EventTarget 위에 잘 통합되기 때문입니다. 결과적으로 개발자는 플랫폼에서 수많은 코드를 마이그레이션하지 않고 관찰 가능성을 사용할 수 있습니다. 오늘날 이벤트를 처리 할 때마다 쉬운 드롭 인이기 때문입니다.
제안 된 API 모양은 https://wicg.github.io/observable/#core-infrastructure에서 찾을 수 있습니다.
subscribe() 호출 될 때마다 동기식으로 호출되는 콜백에서 관찰 가능한 패스의 제작자. subscribe() 메소드를 여러 번 호출 할 수 있으며, 콜백을 호출하면 subscribe() 의 발신자를 관찰자로 등록하여 새로운 "구독"을 설정합니다. 이를 통해 관찰 가능한 것은 next() 콜백을 통해 관찰자에게 수많은 이벤트를 알릴 수 있으며, 선택적으로 데이터 스트림이 완료되었음을 알리는 complete() 또는 error() 에 대한 단일 호출이 이어집니다.
const observable = new Observable ( ( subscriber ) => {
let i = 0 ;
setInterval ( ( ) => {
if ( i >= 10 ) subscriber . complete ( ) ;
else subscriber . next ( i ++ ) ;
} , 2000 ) ;
} ) ;
observable . subscribe ( {
// Print each value the Observable produces.
next : console . log ,
} ) ; Custom Observables는 자체적으로 유용 할 수 있지만, 잠금 해제 된 주요 사용 사례는 이벤트 처리와 관련이 있습니다. EventTarget#when() 메소드가 addEventListener() 와 동일한 기본 메커니즘을 사용하는 내부 콜백으로 기본적으로 생성 될 때 새로운 EventTarget#에 의해 반환 된 관찰 가능. 따라서 Calling subscribe() 본질적으로 관찰자 핸들러 기능을 통해 이벤트가 노출되고 모든 관측 가능성이 이용할 수있는 다양한 콤비네이터와 함께 복합 가능한 새로운 이벤트 리스너를 등록합니다.
관찰 가능성은 위에서 설명한대로 자신의 기본 생성자 또는 Observable.from() 정적 메소드에 의해 생성 될 수 있습니다. 이 방법은 다음 순서대로 다음 중 하나 인 객체에서 관찰 가능한 원시를 구성합니다.
Observable (이 경우 주어진 객체를 반환합니다)AsyncIterable ( Symbol.asyncIterator )Iterable ( Symbol.iterator 가있는 모든 것)Promise (또는 당시 가능한) 또한, 관측 가능한 것을 웹 IDL 인수로 받아들이려는 플랫폼의 모든 방법을 사용하거나, 반환 유형이 Observable 콜백에서 반환하는 방법은 위의 객체 중 하나에서도 그렇게 할 수 있으며, 이는 자동으로 관찰 가능한 것으로 자동 변환됩니다. 우리는 관찰 가능한 사양에서 마무리 할 두 가지 방법 중 하나로이를 달성 할 수 있습니다.
Observable 타입으로 만들어 냄.any 을 지정하고 해당 사양의 산문이 즉시 관찰 가능한 사양이 제공 할 변환 알고리즘을 호출하도록합니다. 이것은 오늘날 스트림 표준이 비동기 반복과 함께하는 것과 유사합니다.60 #60의 대화는 옵션 (1)에 기대어 있습니다.
결정적으로, 관찰 가능성은 구독 될 때까지 데이터를 방출하기 시작하지 않으며 구독 전에 데이터를 대기하지 않는다는 점에서 "게으른"것입니다. 또한 .then() 핸들러를 호출 할 때 항상 마이크로 마스크를 대기하는 약속과 달리 구독 중에 데이터를 동시에 방출하기 시작할 수 있습니다. 이 예를 고려하십시오 :
el . when ( 'click' ) . subscribe ( { next : ( ) => console . log ( 'One' ) } ) ;
el . when ( 'click' ) . find ( ( ) => { … } ) . then ( ( ) => console . log ( 'Three' ) ) ;
el . click ( ) ;
console . log ( 'Two' ) ;
// Logs "One" "Two" "Three" AbortController 사용하면 구독 중에 데이터를 동기식으로 방출하더라도 관찰 가능한 구독을 취소 할 수 있습니다.
// An observable that synchronously emits unlimited data during subscription.
let observable = new Observable ( ( subscriber ) => {
let i = 0 ;
while ( true ) {
subscriber . next ( i ++ ) ;
}
} ) ;
let controller = new AbortController ( ) ;
observable . subscribe ( {
next : ( data ) => {
if ( data > 100 ) controller . abort ( ) ;
} } , { signal : controller . signal } ,
} ) ; 관찰 가능한 가입자가 구독과 관련된 모든 리소스를 정리하기 위해 임의의 파열 콜백을 등록 할 수 있어야합니다. 구독 콜백 내에서 눈물 Observable 뿌릴 수 있습니다. 실행되면 (구독시) 가입 콜백은 subscriber.addTeardown() 통해 찢어짐 함수를 등록 할 수 있습니다.
가입자가 이미 중단 된 경우 (예 : subscriber.signal.aborted 는 true ), 주어진 분해 콜백이 addTeardown() 내에서 즉시 호출됩니다. 그렇지 않으면 동기식으로 호출됩니다.
complete() 에서 가입자의 완전한 핸들러 (있는 경우)가 호출 된 후error() 에서 가입자의 오류 핸들러 (있는 경우)가 호출 된 후 Observable 인터페이스 외에 다음 연산자를 제안합니다.
catch()Promise#catch() 와 마찬가지로 소스 관측 가능한 오류 후에 발사되는 콜백이 필요합니다. 그런 다음 오류가 다시 시작되지 않는 한 콜백에 의해 반환 된 새로운 관찰 가능에 매핑됩니다.takeUntil(Observable)finally()Promise.finally() 와 마찬가지로 관찰 가능한 완료 후 ( complete() / error() )가 완료된 후 발사되는 콜백이 필요합니다.Observable 반환합니다. 콜백이 전달 된 결과에 대한 구독이 어떤 이유로 든 종료되면 finally 발사됩니다. 소스가 완료되거나 오류가 완료된 직후 또는 소비자가 구독을 중단하여 구독을 취소 할 때. 위의 버전은 관찰 가능한 이유에 유용하기 때문에 관찰 가능의 사용자 지구 구현에 종종 존재하지만,이 외에도 기존 플랫폼 선례를 따르고 유틸리티 및 채택을 크게 증가시킬 수있는 일련의 공통 연산자를 제공합니다. 이들은 다른 반복에 존재하며 TC39의 ITERATOR HELPERS 제안에서 파생되어 Iterator.prototype 에 다음 방법을 추가합니다.
map()filter()take()drop()flatMap()reduce()toArray()forEach()some()every()find() 그리고 Iterator 생성자에 대한 다음 방법 :
from() 우리는 사용자 랜드 라이브러리 가이 제안의 Observable API 중심과 통합되는 더 많은 틈새 운영자를 제공 할 것으로 예상하며, 플랫폼으로 졸업하기에 충분한 추진력을 얻을 경우 기본적으로 배송 할 수 있습니다. 그러나이 초기 제안을 위해, 우리는 선언 된 웹 플랫폼 API가 TC39의지도 및 세트 객체에서 영감을 얻은 기본 속성을 갖는 웹 플랫폼 API와 유사하게 위에서 언급 한 선례를 따르는 사람들로 운영자 세트를 제한하고 싶습니다. 따라서 우리는이 세트 확장에 대한 대부분의 논의를 초기 제안서의 범위 외로 고려하여 부록에서 논의하기에 적합합니다. 이 설명자에 제시된 기본 관측 가능한 API에 대한 지원이 있으면 운영자의 긴 꼬리가 따라갈 수 있습니다 .
every() , find() , some() 및 reduce() Return Promiss는 Observables와는 다른 연산자가 있는데, 이는 때때로 e.preventDefault() 호출하는 이벤트 핸들러가 너무 늦게 실행되는 것을 의미합니다. 더 자세하게 설명하는 문제 섹션을 참조하십시오.
관측부가 다른 반응성 프리미티브의 현재 환경에 어떻게 적합한지를 설명하려면 생산자 및 소비자와의 상호 작용으로 반응성 프리미티브를 분류하는 두 개의 다른 테이블을 결합하려는 아래 표를 참조하십시오.
| 단수형 | 복수 | |||
|---|---|---|---|---|
| 공간 | 일시적인 | 공간 | 일시적인 | |
| 푸시 | 값 | 약속하다 | 주목할 만한 | |
| 당기다 | 기능 | 비동기 반복자 | 반복적 인 | 비동기 반복자 |
2015 년 5 월 TC39의 플랫폼에 관찰 가능성이 처음 제안되었습니다.이 제안은 API가 언어 수준의 원시적이기에 적합하다는 일부 반대 때문에 견인력을 얻지 못했습니다. 높은 추상화 수준에서 제안을 갱신하려는 시도에서 2017 년 12 월에 Whatwg DOM 문제가 제기되었습니다. 충분한 개발자 수요, 많은 논의 및 강력한 대상자에도 불구하고 DOM Observables의 제안은 수년간 (API 디자인의 일부 플럭스와 함께) 구현 자 우선 순위가 부족하여 대부분의 경우에도 여전히 SAT SAT (API 디자인의 일부 플럭스).
2019 년 후반에 제안서를 되살리려는 시도는 원래 TC39 저장소에서 다시 이루어졌으며, 여기에는 일부 API 단순화가 포함되었으며 동기식 "Firehose"문제에 대한 지원이 추가되었습니다.
이 저장소는 웹 플랫폼에 버전을 배송하려는 희망으로 관찰 가능한 제안에 다시 생명을 불어 넣으려는 시도입니다.
사전 논의에서 Ben Lesh는 관찰 가능한 프리미티브의 몇 가지 사용자 정의 사용자 랜드 구현을 나열했으며, 그 중 RXJ는 " 주당 47,000,000 개 이상의 다운로드"에서 가장 인기가 있습니다.
Subscription 획득을 위해 start 및 unsubscribe 이벤트가 추가 된 대부분의 동일한 계약.Actor 유형에 대해 관찰 가능한 인터페이스를 사용하여 useActor 후크에 표시된 것처럼 상태 변경으로 구독을 허용합니다. 동일한 관찰 가능한 것을 사용하는 것은 SolidJS와 함께 Xstate를 사용할 때 액세스 상태 머신 변경의 문서화 된 부분입니다.{ subscribe(callback: (value: T) => void): () => void } 패턴을 사용합니다. 이것은 관리자가 관찰 가능한 것으로 영감을 얻은 것으로 지적되었습니다.{ subscribe(callback: (value: T) => void): () => void } 사용합니다.{ subscribe(callback: (value: T) => void): () => void } 와 일치하는 구독 가능한 인터페이스를 사용합니다.{ subscribe(callback: (value: T) => void): () => void } 와 같은 상점에 가입 가능한 계약을 수출하고 사용합니다.{ observe_(callback: (value: T)): () => void } .| async 템플릿에서 | async "비동기 파이프"기능.이 분야의 광범위한 선행 기술을 감안할 때, 공개 "관찰 가능한 계약"이 있습니다.
또한 많은 JavaScript API는 2015 년부터 TC39 제안에 의해 정의 된 계약을 준수하려고 노력하고 있습니다.이를 위해서는 여기에 정의 된 인터페이스에 정확히 연결되는 관찰 가능한 유형 사이의 상호 운용성을 도울 수있는 라이브러리, 상징적 관찰 가능, Ponyfills (Ponyfills) Symbol.observable 가 있습니다. symbol-observable 에는 NPM에 479 개의 종속 패키지가 있으며 주당 13,000,000 회 이상 다운로드됩니다. 이는 NPM에 관찰 가능한 계약을 어떤 방식으로 사용하는 최소 479 개의 패키지가 있음을 의미합니다.
이것은 Promise S가 일류 언어 원시적으로 ES2015에 채택되기 전에 개발 된 약속/A+ 사양과 유사합니다.
원래 Whatwg dom 스레드에 표현 된 주요 관심사 중 하나는 제안 된 first() 와 같이 관찰 가능한 API와 관련하여 약속을 지정합니다. 마이크로스크 스케줄링 및 이벤트 통합이 포함 된 잠재적 인 풋군. 구체적으로, 다음의 무고한 코드가 항상 작동하지는 않습니다.
element
. when ( 'click' )
. first ( )
. then ( ( e ) => {
e . preventDefault ( ) ;
// Do something custom...
} ) ; Observable#first() 가 EventTarget 에서 첫 번째 이벤트가 해고 될 때 해결하는 약속을 반환하면 사용자가 제공 한 약속 .then() 핸들러가 실행됩니다.
element.click() )e.preventDefault() 너무 늦게 일어 났고 효과적으로 무시 될 것임을 의미합니다.콜백이 호출 된 후 WebIdl에서 스크립트를 실행 한 후 HTML 알고리즘 정리가 호출 되며이 알고리즘 호출은 JavaScript 스택이 비어있는 경우에만 마이크로 스크립트 체크 포인트를 수행합니다 .
구체적으로, 이는 element.click() 위의 예에서 다음 단계가 발생합니다.
element.click() 실행하려면 JavaScript 실행 컨텍스트가 먼저 스택에 푸시됩니다.click 이벤트 리스너 콜백을 실행하려면 ( Observable#from() 의해 기본적으로 생성)를 실행하려면 WebIdl이 내부 콜백을 실행할 준비를하면서 다른 JavaScript 실행 컨텍스트가 스택으로 밀려 나옵니다.Observable#first() 가 반환 한 약속을 즉시 해결합니다. 이제 마이크로 스스크 큐에는 약속의 사용자 공급 then() 핸들러가 포함되어있어 이벤트가 실행되면 이벤트를 취소 할 수 있습니다.click 이벤트 콜백이 실행 된 후 콜백 중 또는 직후 이벤트가 취소되지 않았기 때문에 나머지 이벤트 경로는 계속됩니다. 이벤트는 일반적으로 수행 할 모든 작업을 수행합니다 (양식 제출, alert() 사용자 등).element.click() 포함하는 JavaScript가 완료되고 최종 실행 컨텍스트가 스택에서 팝업되고 마이크로 워스 큐가 플러시됩니다. 사용자가 공급 한 .then() 핸들러가 실행되어 이벤트를 너무 늦게 취소하려고합니다. 두 가지 가이 문제를 완화시킵니다. 첫째, e.preventDefault() 너무 늦게 실행될 수있는 경우를 항상 피하기위한 매우 간단한 해결 방법이 있습니다.
element
. when ( 'click' )
. map ( ( e ) => ( e . preventDefault ( ) , e ) )
. first ( ) ; ... 또는 관찰 가능한 경우 .do() 메소드가있는 경우 (Whatwg/dom#544 (comment) 참조) :
element
. when ( 'click' )
. do ( ( e ) => e . preventDefault ( ) )
. first ( ) ; ... 또는 first() 의 의미를 수정하여 반환 된 약속이 해결하는 값을 생성하는 콜백을 가져옵니다.
el . when ( 'submit' )
. first ( ( e ) => e . preventDefault ( ) )
. then ( doMoreStuff ) ;둘째,이 "quirk"는 오늘날의 번성하는 관찰 가능한 생태계에 이미 존재하며, 개발자들이 일관되게이를 수행하고 있다는 커뮤니티의 심각한 우려 나 보고서는 없습니다. 이것은이 동작을 웹 플랫폼에 베이킹하는 것이 위험하지 않을 것이라는 확신을줍니다.
어떤 표준 장소가 궁극적으로 관찰 가능한 제안을 주최 해야하는지에 대한 많은 논의가있었습니다. 이 회장은 관찰 가능성이 Promise 과 같은 언어 수준의 원시인이되는지, 모든 JavaScript 브라우저 엔진에서 선박 또는 Node.js와 같은 다른 환경에서 고려할 가능성이있는 웹 플랫폼 ( AbortController 참조)에서 고려할 가능성이있는 웹 플랫폼을 효과적으로 결정하기 때문에 중요 하지 않습니다.
관찰 정보는 의도적으로 메인 이벤트-방출 인터페이스 ( EventTarget ) 및 웹 플랫폼에 거주하는 Cancellation Primitive ( AbortController )와 마찰로 통합됩니다. 여기에 제안 된 바와 같이, 관찰 정보는 DOM 표준에서 기존의 강력하게 연결된 구성 요소에 합류합니다. 우리는 관찰 가능성이 지원 프리미티브가 사는 곳에 가장 적합하다고 생각하기 때문에 Whatwg 표준 장소는 아마도이 제안을 발전시키기에 가장 좋은 장소 일 것입니다. 또한 Node.js 및 Deno와 같은 비 Web ECMAScript impledder는 여전히 Web Platform aborting and Events에 대한 약속을 감안할 때 여전히 관찰 가능성을 채택 할 수 있으며 심지어 가능성이 높습니다.
이것은 미래에 TC39의 이벤트-방출 및 취소 프리미티브의 향후 표준화를 배제하지는 않습니다. 그러나 현재로서는 Whatwg에서 발전하도록 동기를 부여하고 있습니다.
이 토론을 구제하지 않기 위해 독자는 다음 토론 의견을 보도록 촉구합니다.
이 섹션에서는이 저장소 이외의 관찰 가능한 제안의 수명을 추적하는 데 사용되는 웹 표준 및 표준 위치의 모음을 금지합니다.
관찰 정보는 이벤트 처리를보다 인체 공학적이고 합성 가능하게 만들도록 설계되었습니다. 따라서 최종 사용자에게 미치는 영향은 간접적이며 대부분 개발자가 현재 타사 라이브러리를 사용하는 패턴을 구현하기 위해 덜 JavaScript를 다운로드 해야하는 사용자의 형태로 나타납니다. 설명 자에서 위에서 언급 한 바와 같이, 번성하는 사용자 랜드 관측형 생태계가 있으며, 이는 매일 많은 과도한 바이트가 다운로드됩니다.
관찰 가능한 API의 강력한 사용자 노선을 체계화하기 위해이 제안은 매일 수십 개의 사용자 정의 구현이 다운로드되는 것을 막을 것입니다.
또한 EventTarget , AbortController 및 Promise S와 관련된 API로서 개발자는 선언적으로 구성하여 복잡한 이벤트 처리 흐름을 구축 할 수 있으므로 웹에서 더 많은 사용자 경험을 구축 할 수 있습니다.