5분 동안 관찰된 RxJS 규명
13373 단어 angularwebdevbeginnersjavascript
승낙
관점에서 HTTP 요청은 좋은 출발점이자 오도이다.그것들의 API는 결과와 오류를 탐지하는 데 사용되는 성공과 실패 리셋을 제공하기 때문에 약간 비슷하다.
const observable = api.callWithObservable();
const promise = api.callWithPromise();
observable.subscribe(
result => { /* on success */ },
error => { /* on error */ }
);
promise.then(
result => { /* on success */ },
error => { /* on error */ }
);
우리는 함수 호출을 통해 작업을 시작하고, 되돌아오는 관찰/약속은 잠시 후에 결과/오류를 보냅니다.비슷한 점은 여기서부터 시작하고 끝난다.다른 모든 것, 집행, 결과 수량, 행위는 다르다.여러 결과
한 번만 결과를 내놓겠다고 약속했지만 시간이 지날수록 관찰 대상은 여러 개의 값을 낼 수 있다.
const observable = Rx.Observable.interval(1000).take(5);
observable.subscribe(
result => console.log(result),
error => { /* on error */ },
() => { /* on complete */ }
);
상기 예시에서 관찰 대상은 1초 지연된 값 0, 1, 2, 3, 4를 보내고 완성할 수 있다.subscribe 방법은 다섯 번 호출되었는데, 그 값을 제외하고, 우리는 흐름의 끝을 측정할 수 있습니다.완료되면subscribe 함수에서 세 번째 리셋을 호출합니다.그런 다음 관찰 가능 객체는 값을 보내지 않습니다.시간의 추이에 따라 값을 보내면 관찰할 수 있는 값이 흐름과 매우 비슷하다(예를 들어 Node.js에서).두 개의 단독 흐름이나 버퍼를 합치는 것과 같은 방법도 있을 수 있습니다.
동기화 실행
약속을 해석한 후, 비동기적으로 then 리셋을 호출합니다.Javascript 이벤트 순환 내에서 다음 주기에 리셋이 실행됩니다.반대로 값을 전송한 후 관찰 대상의 구독이 동기화됩니다.
let promiseResult;
Promise.resolve(15).then(val => {
promiseResult = val;
console.log('resolved promise', val);
});
console.log('result promise', promiseResult); // result promise undefined
let observableResult;
Rx.Observable.of(15).subscribe(val => {
observableResult = val;
console.log('resolved observable', val);
});
console.log('result observable', observableResult); // result observable 15
이 예시를 실행하면, 컨트롤러로 출력할 때, then 리셋에서 분배된 값이 정의되지 않은 것을 볼 수 있습니다.로그다른 한편,subscribe 리셋의 값은 정의되지 않고 컨트롤러에서 출력됩니다.로그다음 방법을 호출할 때, 이 동기화 실행도 주제에 적용된다.
const subject = new Rx.Subject();
let observableResult;
subject.subscribe(val => {
observableResult = val;
console.log('resolved observable', val);
});
subject.next(15);
console.log('result observable', observableResult); // result observable 15
모든 구독을 동기화하기 때문에 분석된 로그는 컨트롤러의 결과 앞에 나타납니다.여러 번 실행
당신은 관찰할 수 있는 물건을 여러 번 구독할 때 일이 이상하게 변하는 것을 경험해 본 적이 있습니까?예를 들어 여러 번 실행, 예를 들어 HTTP 요청?
이것은subscribe 방법을 호출할 때 관찰 대상을 위한 단독 실행을 만들기 때문입니다.이 실행이 HTTP 요청으로 구성되면 끝점이 다시 호출됩니다.
const observable = Rx.Observable.interval(1000).take(5);
observable
.subscribe(x => console.log('A next ' + x)); // create an execution
setTimeout(() => {
observable
.subscribe(x => console.log('B next ' + x)); // create an execution
}, 2000);
// A next 0
// A next 1
// B next 0
// A next 2
// B next 1
// A next 3
우리는 2초 후에 도착한 두 번째 구독 (B) 이 첫 번째 구독과 같은 값을 받기를 기대한다.그러나 실제로 B는 처음부터 값을 받았는데 2초만 지연되었다.이 배후의 원인은 모든subscribe 방법이 새로운 실행을 만들고 이전 방법과 다른 관찰 실행을 다시 시작하기 때문이다.같은 약속을 위해 여러 개의 then 방법을 작성할 때, 약속은 다시 시작하지 않습니다.그들은 비동기적으로 실행하고 같은 값을 얻는다.관찰할 수 있는 대상과 같은 행동을 만들기 위해서, 우리는 모든 구독자에게 같은 실행을 제공하는 공유 조작부호를 적용해야 한다.백그라운드에서 조작자는 테마를 만들고 값을 이 테마에 전달합니다.
수조 방법
Promises는 then 방법으로만 되돌아오는 값을 바꾸지만, Observable에는 여러 가지 방법이 있습니다.이 방법들의 명칭은 수조 방법과 매우 비슷하다.
promise
.then(value => value + 5)
.then(value => Promise.resolve(9));
observable.pipe(
map(value => value + 5),
flatMap(value => Rx.Observable.of(9)),
filter(value => value > 5)
);
then 방법에서 새 값이나 약속을 되돌릴 수 있습니다.그 작용은 같다.다음 then 방법은 이전에 되돌아온 값을 가져옵니다.관측 가능한 항목에 대해 우리는 동기화(map)와 비동기화(flatMap) 변환을 분리해야 한다.관찰할 수 있는 대상도 많은 수조 방법(필터링, 감소, 연결, 포함 등)과 실용 프로그램 라이브러리의 수조 방법(Lodash:pluck,groupBy 등)이 있다아니면 모르겠어요?
내가 관찰물을 배웠을 때 the RxMarbles site 그것들을 매우 뚜렷하게 만들었다.RxMarbles는 구성 요소의 동작을 관찰할 수 있는 타임라인을 설명하는 그래픽 표현입니다.서로 다른 색깔은 서로 다른 출처에서 온 서로 다른 사건과 그들의 행동을 의미한다. 예를 들어 우리가 그것들을 합병할 때.
총결산
약속을 통해 관찰할 수 있는 것을 이해할 수 있지만, 그 차이점을 알아야 한다.
Reference
이 문제에 관하여(5분 동안 관찰된 RxJS 규명), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vuesomedev/clarifying-rxjs-observables-under-5-minutes-2dh3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)