首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角9-关于可观测性和map()的问题,它如何返回类的特定属性?

角9-关于可观测性和map()的问题,它如何返回类的特定属性?
EN

Stack Overflow用户
提问于 2020-05-13 07:35:22
回答 1查看 180关注 0票数 0

我正在继续一个前同事的项目,我对一些代码有疑问,我不明白其中的某些部分。

为了给您提供一些上下文,我们有一个UserInfo类,它看起来如下:

代码语言:javascript
复制
export class UserInfo {
  constructor(
    public readonly userLoginId: string,
    public readonly hasLocalPassword: boolean,
    public readonly loginMethods: Array<LoginInfo>,
    public readonly loginMethodsAvailable: Array<LoginInfo>,
    public readonly isAuthenticated: boolean,
  ) {}
}

export class LoginInfo {
  constructor(
    public readonly loginID: number,
    public readonly displayName: string,
    public readonly logoUrl: string
  ) {
    if ([loginID, logoUrl, displayName].some(s => !s)) {
      throw Error("not all arguments passed for LoginInfo");
    }
  }
}

然后在一个Service class中,对于属性loginMethodsloginMethodsAvailable,我们有2 observables

代码语言:javascript
复制
 private readonly _loginMethodSub = new BehaviorSubject(Array<LoginInfo>());
  private readonly _loginMethodAvailableSub = new BehaviorSubject(Array<LoginInfo>());

 public readonly loginMethod = this._loginMethodSub.asObservable().pipe(map(loginMethod => loginMethod || []));

 public readonly loginMethodAvailable = this._loginMethodAvailableSub.asObservable().pipe(map(loginMethod => loginMethod || []));

现在第一个疑问是,在这两个可观测值中,我们都是map() LoginInfo类,但是“如何”将类属性loginMethodsloginMethodsAvailable分配给正确的可观察性?我希望我的意思很清楚,从这段代码中,似乎两种可观察到的都是相同的,它们只是使用不同的behaviourSubject,但是代码如何知道一个用于类属性loginMethods,另一个用于loginMethodsAvailable?最初,我认为使用map()时,如果您使用Class属性的确切名称,它将过滤该可观测的属性并只输出该属性,但是map()中使用的名称在这两种情况下都是相同的,所以这并不重要。

最后,关键部分可能是这个Service类的构造函数:

代码语言:javascript
复制
constructor(private http: HttpClient) {
    this.User.pipe(map(uInfo => uInfo && uInfo.loginMethods)).subscribe(this._loginMethodSub);
    this.User.pipe(map(uInfo => uInfo && uInfo.loginMethodsAvailable)).subscribe(this._loginMethodAvailableSub);
  }

this.User只是主要可观察到的:

代码语言:javascript
复制
  private readonly _userSub = new BehaviorSubject<UserInfo>(null);
  public readonly User = this._userSub.asObservable();

那么构造函数中发生了什么呢?我从未见过这种语法,它订阅并传递给它一个BehaviorSubject

同样,我主要怀疑的是,可观测的loginMethod和可观测的loginMethodAvailable如何发出正确的值?这段代码是在哪一部分中定义的?

代码正在工作,当我订阅loginMethod时,输出值是类UserInfo的属性loginMethods: <LoginInfo[]>,而当我订阅loginMethodAvailable时,我得到属性loginMethodsAvailable:<LoginInfo[]>的值,我只是不明白怎么回事。

我希望我说清楚了!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-13 11:41:42

,那么构造函数中发生了什么呢?我从未见过这种语法,它订阅并传递给它一个BehaviorSubject?

当您有多个订阅者并期望每个订阅者都收到相同的值时,您必须使用BehaviorSubjectMore on that here

--我主要怀疑的是,可观测的loginMethod和可观测的loginMethodAvailable是如何发出正确的值的?这段代码是在哪一部分中定义的?

视情况而定,它们发出不同的值。

使用代码示例查看示例片段。

代码语言:javascript
复制
const _loginMethodSub = new rxjs.BehaviorSubject();
const _loginMethodAvailableSub = new rxjs.BehaviorSubject();
const _userSub = new rxjs.BehaviorSubject(null);
const User = _userSub.asObservable();

const loginMethod = _loginMethodSub.asObservable().pipe(
  rxjs.operators.map(loginMethod => loginMethod || []));

loginMethod.subscribe(value => {
  console.log(value);
})

const loginMethodAvailable = _loginMethodAvailableSub.asObservable().pipe(
  rxjs.operators.map(loginMethod => loginMethod || []));

loginMethodAvailable.subscribe(value => {
  console.log(value);
})

console.log('User.pipe call ctor')

User.pipe(rxjs.operators.map(uInfo => uInfo && uInfo.loginMethods)).subscribe(_loginMethodSub);

User.pipe(rxjs.operators.map(uInfo => uInfo && uInfo.loginMethodsAvailable)).subscribe(_loginMethodAvailableSub);

console.log('api call')

_userSub.next({
  loginMethods: [{
    loginID: 1,
    displayName: 'test1',
    logoUrl: 'test1'
  }, {
    loginID: 2,
    displayName: 'test2',
    logoUrl: 'test2'
  }],
  loginMethodsAvailable: [{
    loginID: 1,
    displayName: 'test1',
    logoUrl: 'test1'
  }]
})
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.js"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61768844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档