从回调中创建可观察对象

问题描述 投票:0回答:4

我有一个身份验证防护,当访问站点并且用户已经登录时,需要异步响应 true/false。

我正在使用 Firebase 的

onAuthStateChanged
链接到文档),它使用回调函数。如何将我的
isLoggedIn()
方法变成可以返回
Observable<boolean>
的方法?

打字稿:

get isLoggedIn(): Observable<boolean> {

    // want something like this:
    return Observable.fromCallback(firebase.auth().onAuthStateChanged).map(user => !!user);

    // this returns () => boolean, but I need a promise or observable
    return firebase
      .auth()
      .onAuthStateChanged((user) => {
        return !!user;
      });

}
javascript angular firebase firebase-authentication rxjs
4个回答
27
投票

你可以这样做。

get isLoggedIn(): Observable<boolean> {

  // want something like this:
  return Observable.create(
    observer => firebase
        .auth()
        .onAuthStateChanged((user) => {
          observer.next(!!user)
        });
    );
}

15
投票

还有另一种方法可以使用 rxjs/observable/bindCallback 中的 bindCallback 来完成此操作

const observable=bindCallback(functionWhichExpectsCallBack)

例如

function foo(value, callback) {
  callback(value);
}
//converts callback to observable
    const observable = bindCallback(foo); 
    observable(1)
      .subscribe(console.log); 

8
投票

注意:

bindCallback
Observable.create
已弃用,
你可以使用
new Observable
代替:

...
return new Observable((subscriber) => {
  firebase
    .auth()
    .onAuthStateChanged((user) => {
      subscriber.next(user);
    })
}

0
投票

还有一种方法

get isLoggedIn(): Observable<boolean> {
    const resultSubject = new Subject<any>();
    firebase.auth().onAuthStateChanged((user) => {
        resultSubject.next(user ? true : false);
        resultSubject.complete();
    });
    return resultSubject.asObservable();
}

如果你需要捕获错误: onFailure: (err: Error) => { resultSubject.error(错误); }

注意:onFailure 与 firebase 无关,仅用于示例目的

© www.soinside.com 2019 - 2024. All rights reserved.