2016-07-24 7 views
4

두 가지 방법으로 약속을 만들고 반환하는 간단한 예제가 있습니다. 두 번째 메서드 buildRedCar()은 첫 번째 메서드 buildCar()을 호출하고 약속에 의해 반환 된 값을 수정하고 자신으로부터 또 다른 약속을 반환합니다. 그런 다음 코드는 buildRedCar()을 호출하고 결과를 console.logs 만 출력합니다. 약속으로 변환 할 때 이것은 작동하지 않지만 직선 관측 자료를 사용할 때는 이됩니다.Rxjs toPromise 동작이 관찰 가능하지 않음

하지 작업을 을 수행

import * as Rx from 'rx'; 

function buildCar(): Rx.IPromise<string> { 
    let car = 'Car'; 
    return Rx.Observable.just<string>(car).toPromise(); 
} 

function buildRedCar(): Rx.IPromise<string> { 
    let observable = Rx.Observable.create<string>((observer) => { 
     buildCar().then((car) => { 
      observer.onNext('Red ' + car); 
     }); 
    }) 

    return observable.toPromise(); 
} 

buildRedCar().then((car) => { 
    console.log(car); 
}); 

합니까 일 :

import * as Rx from 'rx'; 

function buildCar(): Rx.Observable<string> { 
    let car = 'Car'; 
    return Rx.Observable.just<string>(car); 
} 

function buildRedCar(): Rx.Observable<string> { 
    let observable = Rx.Observable.create<string>((observer) => { 
     buildCar().subscribe((car) => { 
      observer.onNext('Red ' + car); 
     }); 
    }) 

    return observable; 
} 

buildRedCar().subscribe((car) => { 
    console.log(car); 
}); 

어떤 생각이 왜 유일한 차이점은 반환하기 전에 약속에 관찰을 변환하는 다른 행동?

답변

9

RxJ는 Observable을 Promise로 변환 할 때 관찰 가능 값에서 마지막으로 값을 산출하는 Promise를 만듭니다. 따라서 약속은 근본적인 관측이 완료 될 때까지 해결되지 않습니다.

첫 번째 예에서는 (그리고 두 번째도 마찬가지입니다.) 관찰 가능한 빨간 차를 완성하지 못합니다. 그러므로 약속은 결코 해결되지 않습니다. 따라서 약속을 감싸는 관찰 결과는 결코 가치를 창출하지 못합니다 ...

두 번째 예제는 빨간 자동차가 도착할 때 관찰 가능한 빨간색으로 생성 된 첫 번째 값을 열심히 인쇄하고 결코 절대로 결과를 기다리지 않기 때문에 작동합니다 태어나다.

observer.onNext('Red ' + car); 
observer.onComplete(); 
:

onComplete에 전화를 추가하면 첫 번째 버전의 작업을해야한다

관련 문제