【问题标题】:Observable - start to emit conditionallyObservable - 开始有条件地发射
【发布时间】:2017-05-24 08:20:09
【问题描述】:

有没有办法从一个 observable 有条件地开始发射值?在我的例子中,.asObservable() 函数的订阅者应该只在 CurrentUser 被初始化之后才能获得第一个值。

export class CurrentUser {

    private currentUser$: Observable<CurrentUser>;
    private currentUserBehaviorSubject: BehaviorSubject<CurrentUser>;

    public name: string = "";

    constructor() {
        this.currentUserBehaviorSubject = new BehaviorSubject(this);
        this.currentUser$ = this.currentUserBehaviorSubject.asObservable();
    }

    public asObservable(): Observable<CurrentUser> {
        // 
        if(user.name.length > 0){
            return this.currentUser$;
        }
        else {
            // ?????
        }
    }

    public initialize(string name){
        this.name = name;
        this.currentUserBehaviorSubject.next(this);
    }
}

export class SampleComponent {
    constructor(
        currentUser: CurrentUser
    ) {
        currentUser.asObservable().subscribe(
            (u: CurrentUser) => {
                // i only want an INITIALIZED user here
            },
            error => {},
            () => { }
        );
    }
}

【问题讨论】:

  • 谁初始化了示例组件

标签: angular typescript rxjs rxjs5


【解决方案1】:

看起来您可以在您的 asObservable() 方法中始终返回一个 Observable 并使用 skipUntil() 运算符抑制发射,直到 currentUserBehaviorSubject 发射(我想这就是您知道 CurrentUser 已被初始化的方式):

public asObservable(): Observable<CurrentUser> {
    return this.currentUser$
        .skipUntil(this.currentUserBehaviorSubject);
}

【讨论】:

    【解决方案2】:

    我是怎么看的:

    export class CurrentUser {
        subject: Subject<CurrentUser> = new Subject<CurrentUser>();
        observable: Observable<CurrentUser = this.subject.asObservable();
    
        constructor() {
            // Do your business
            this.subject.next(this);
        }
    }
    

    在您的组件中,只需订阅 observable 属性。

    这样,当您初始化一个新的 CurrentUser 时,您的观察者会收到通知。这是你想要的,还是我误解了?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2017-03-09
      相关资源
      最近更新 更多