我有一个身份验证防护,当访问站点并且用户已经登录时,需要异步响应 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;
});
}
你可以这样做。
get isLoggedIn(): Observable<boolean> {
// want something like this:
return Observable.create(
observer => firebase
.auth()
.onAuthStateChanged((user) => {
observer.next(!!user)
});
);
}
还有另一种方法可以使用 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);
注意:
bindCallback
和 Observable.create
已弃用,new Observable
代替:
...
return new Observable((subscriber) => {
firebase
.auth()
.onAuthStateChanged((user) => {
subscriber.next(user);
})
}
还有一种方法
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 无关,仅用于示例目的