2016-07-24 4 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

Когда RxJs преобразует Observable в Promise, он создает Promise, который даст последнее значение из наблюдаемого. Таким образом, обещание не будет разрешаться до тех пор, пока основные наблюдаемые не завершатся.

В вашем первом примере (а также в вашем втором) вы никогда не завершаете наблюдаемый красный автомобиль. Поэтому обещание никогда не решает. Поэтому наблюдаемый, который обертывает обещание, никогда не дает значения ...

Ваш второй пример работает, потому что подписка с нетерпением печатает первое значение, полученное вашим красным автомобилем, наблюдаемое по мере его поступления, а затем «ждет» дальнейших результатов, которые никогда не будут прибыть.

Добавление вызова к onComplete должен сделать свою первую версию работы:

observer.onNext('Red ' + car); 
observer.onComplete(); 
Смежные вопросы