2017-01-29 3 views
4

В официальном angular2 tutorial содержит следующий кодЯвляется наблюдаемым и обещающим совместимым в rxjs?

getHeroes(): Promise<Hero[]> { 
    return Promise.resolve(HEROES); 
} 

ngOnInit(): void { 
    this.route.params 
    .switchMap((params: Params) => this.heroService.getHero(+params['id'])) 
    .subscribe(hero => this.hero = hero); 

    console.log(this.route.params); 
    console.log(this.route.params 
    .switchMap((params: Params) => this.heroService.getHero(+params['id']))); 
} 

Теперь мы знаем, что this.route.params возвращает наблюдаемым, в то время как this.heroService.getHero(+params['id']) возвращает обещание

Вот подпись для rxjsswitchmap

switchMap(project: function: Observable, resultSelector: function(outerValue, innerValue, outerIndex, innerIndex): any): Observable 

Мы видим, что первый параметр принимает функцию, которая испускает наблюдаемую ,

Однако в приведенном выше примере мы фактически прошли функцию, которая испускает обещание.

Совместимы ли они друг с другом?

Кроме того, консоль

console.log(this.route.params 
.switchMap((params: Params) => this.heroService.getHero(+params['id']))); 

выходы

AnonymousSubject {_isScalar: false, observers: Array[0], closed: false, isStopped: false, hasError: false…} 

_isScalar не должны быть установлены в верно, так как функция выводит обещание?

+0

Возможно, вы ищете 'Observable # fromPromise' ([v4 docs] (https://github.com/Reactive-Extensions/RxJS/blob/v4.1.0/doc/api/core/operators/frompromise.md), [v5 docs] (http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-fromPromise)) – Whymarrh

+0

@Whymarrh, так что 'fromPromise' неявно вызывается в примере I приведенный выше? – Kevin

ответ

5

Во многих местах, то RxJS API принимает ObservableInput:

export type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T>; 

Что может быть наблюдаемым, обещание или массив типа, итерация объекта.

В коде, который вы включили в свой вопрос, функция project передана в switchMap, дает обещание. Это нормально, так как switchMap принимает project функции, которые возвращают ObservableInput:

export function switchMap<T, R>(
    this: Observable<T>, 
    project: (value: T, index: number) => ObservableInput<R> 
): Observable<R>; 

switchMap реализация будет видеть, что обещание превращается в наблюдаемой.

Относительно результирующая наблюдаемую-х внутренней_isScalar свойства, оно будет установлено в true когда обещание решает и разрешенное значение сохраняется в пределах наблюдаемого. Я понимаю, что в RxJS скаляр не относится к числу значений, которые будут испускаться, но вместо этого относится к тому, доступны ли указанные значения для немедленной эмиссии.

Смежные вопросы