In the official angular2 tutorial it contains the following code
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'])));
}
Now we know that this.route.params
returns an observable, while this.heroService.getHero(+params['id'])
returns a promise
Here is the signature for rxjs
switchmap
switchMap(project: function: Observable, resultSelector: function(outerValue, innerValue, outerIndex, innerIndex): any): Observable
We see that the first parameter takes a function that emits an observable.
However in the example above we actually passed in a function that emits a promise.
Are they compatible with each other?
Furthermore the console
console.log(this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id'])));
outputs
AnonymousSubject {_isScalar: false, observers: Array[0], closed: false, isStopped: false, hasError: false…}
shouldnt the _isScalar
be set to true, since the function outputs a promise?
In many places, the RxJS API accepts an ObservableInput
:
export type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T>;
Which can be an observable, a promise or an array-like, iterable object.
In the code you have included in your question, the project
function passed to switchMap
returns a promise. That's fine, as switchMap
accepts project
functions that return an ObservableInput
:
export function switchMap<T, R>(
this: Observable<T>,
project: (value: T, index: number) => ObservableInput<R>
): Observable<R>;
The switchMap
implementation will see that the promise is converted to an observable.
Regarding the resultant observable's internal _isScalar
property, it will be set to true
when the promise resolves and the resolved value is stored within the observable. My understanding is that in RxJS, scalar does not refer the the number of values that will be emitted, but instead refers to whether or not said values are available for immediate emission.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.