Javascript 从回调中进行可观察
我有一个auth-guard,当访问站点并且用户已经登录时,它需要异步响应true/falseJavascript 从回调中进行可观察,javascript,angular,firebase,firebase-authentication,rxjs,Javascript,Angular,Firebase,Firebase Authentication,Rxjs,我有一个auth-guard,当访问站点并且用户已经登录时,它需要异步响应true/false 我正在使用Firebase的onAuthStateChanged(),它使用回调函数。如何将我的isLoggedIn()方法转换为可以返回可见的 脚本: get isLoggedIn(): Observable<boolean> { // want something like this: return Observable.fromCallback(firebase.a
我正在使用Firebase的
onAuthStateChanged
(),它使用回调函数。如何将我的isLoggedIn()
方法转换为可以返回可见的
脚本:
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.fromCallback(firebase.auth().onAuthStateChanged).map(user=>!!user);
//这将返回()=>布尔值,但我需要一个承诺或可观察值
返回火基
.auth()
.onAuthStateChanged((用户)=>{
返回!!用户;
});
}
你可以这样做
get isLoggedIn(): Observable<boolean> {
// want something like this:
return Observable.create(
observer => firebase
.auth()
.onAuthStateChanged((user) => {
observer.next(!!user)
});
);
}
get isLoggedIn():可观察{
//想要这样的东西:
返回可观察的。创建(
观察员=>firebase
.auth()
.onAuthStateChanged((用户)=>{
观察者。下一个(!!用户)
});
);
}
使用rxjs/observable/bindCallback中的bindCallback还有一种方法可以做到这一点
const observable=bindCallback(functionWhichExpectsCallBack)
e、 g
注意:bindCallback
和Observable.create
已被弃用,
您可以使用newobservable
:
...
return new Observable((subscriber) => {
firebase
.auth()
.onAuthStateChanged((user) => {
subscriber.next(user);
})
}
请注意,这将为每个属性访问/订阅添加一个侦听器,并且不会删除该侦听器。传递给create
的arrow函数应该返回onAuthStateChanged
的结果(这是一个删除侦听器的函数)。这样做会在observable被取消订阅时看到侦听器被删除。@cartant或rohit您是否介意添加一个订阅/取消订阅的示例以使此答案更彻底?onAuthStateChanged()
返回unsubscribe函数,因此在创建可观察对象时,只需删除订阅函数中的花括号:observatable.create(observer=>firebase.auth().onAuthStateChanged(user=>observer.next(!!user))
。是自RxJs 6以来解决该问题的现代方法。签出。bindCallback
未被弃用
...
return new Observable((subscriber) => {
firebase
.auth()
.onAuthStateChanged((user) => {
subscriber.next(user);
})
}