Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从回调中进行可观察_Javascript_Angular_Firebase_Firebase Authentication_Rxjs - Fatal编程技术网

Javascript 从回调中进行可观察

Javascript 从回调中进行可观察,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

我有一个auth-guard,当访问站点并且用户已经登录时,它需要异步响应true/false


我正在使用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);
    })
}