加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angular – 可观察并承诺在rxjs中兼容吗?

发布时间:2020-12-17 17:28:01 所属栏目:安全 来源:网络整理
导读:在官方 angular2 tutorial中它包含以下代码 getHeroes(): PromiseHero[] { return Promise.resolve(HEROES);}ngOnInit(): void { this.route.params .switchMap((params: Params) = this.heroService.getHero(+params['id'])) .subscribe(hero = this.hero =
在官方 angular2 tutorial中它包含以下代码

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’])返回一个promise

这是rxjs switchmap的签名

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

我们看到第一个参数采用发出可观察的函数.

但是在上面的例子中,我们实际上传递了一个发出promise的函数.

它们是否相互兼容?

此外还有控制台

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设置为true,因为该函数会输出一个承诺吗?

解决方法

在许多地方,RxJS API接受 ObservableInput

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

这可以是一个可观察的,一个promise或一个类似数组的可迭代对象.

在您的问题中包含的代码中,传递给switchMap的项目函数返回一个promise.没关系,因为switchMap接受返回ObservableInput的项目函数:

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

switchMap实现将看到promise被转换为observable.

关于结果observable的内部_isScalar属性,当promise解析并且解析的值存储在observable中时,它将被设置为true.我的理解是,在RxJS中,标量不是指将要发射的值的数量,而是指所述值是否可用于立即发射.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读