programing

RxJS에서 Observable 연결

minecode 2021. 1. 16. 09:27
반응형

RxJS에서 Observable 연결


RxJS와 Angular 2를 배우고 있습니다. 이전 결과에 의존하는 여러 비동기 함수 호출이있는 promise 체인이 있다고 가정 해 보겠습니다.

var promiseChain = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(1);
  }, 1000);
}).then((result) => {
  console.log(result);

  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(result + 2);
    }, 1000);
  });
}).then((result) => {
  console.log(result);

  return new Promise((resolve, reject) => {
      setTimeout(() => {
      resolve(result + 3);
        }, 1000);
  });
});

promiseChain.then((finalResult) => {
  console.log(finalResult);
});

약속을 사용하지 않고 RxJS만을 사용하여 동일한 작업을 수행하려는 시도는 다음과 같습니다.

var observableChain = Observable.create((observer) => {
  setTimeout(() => {
    observer.next(1);
    observer.complete();
  }, 1000);
}).flatMap((result) => {
  console.log(result);

  return Observable.create((observer) => {
    setTimeout(() => {
      observer.next(result + 2);
      observer.complete()
    }, 1000);
  });
}).flatMap((result) => {
  console.log(result);

  return Observable.create((observer) => {
    setTimeout(() => {
      observer.next(result + 3);
      observer.complete()
    }, 1000);
  });
});

observableChain.subscribe((finalResult) => {
  console.log(finalResult);
});

약속 체인과 동일한 결과를 산출합니다. 내 질문은

  1. 내가이 일을 제대로하고 있는가? 위의 코드를 개선 할 수있는 RxJS 관련 개선 사항이 있습니까?

  2. 이 관찰 가능한 체인을 반복적으로 실행하려면 어떻게해야합니까? 즉, 끝에 다른 구독을 추가하면 1, 3 및 6을 인쇄 할 것으로 예상하지만 추가 6이 생성됩니다.

    observableChain.subscribe ((finalResult) => {console.log (finalResult);});

    observableChain.subscribe ((finalResult) => {console.log (finalResult);});

    1 3 6 6


About promise composition vs. Rxjs, as this is a frequently asked question, you can refer to a number of previously asked questions on SO, among which :

Basically, flatMap is the equivalent of Promise.then.

For your second question, do you want to replay values already emitted, or do you want to process new values as they arrive? In the first case, check the publishReplay operator. In the second case, standard subscription is enough. However you might need to be aware of the cold. vs. hot dichotomy depending on your source (cf. Hot and Cold observables : are there 'hot' and 'cold' operators? for an illustrated explanation of the concept)

ReferenceURL : https://stackoverflow.com/questions/37771855/chaining-observables-in-rxjs

반응형