从回调中创建一个Observable

Nic*_*nas 7 javascript rxjs firebase firebase-authentication angular

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

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

Typscript:

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;
      });

}
Run Code Online (Sandbox Code Playgroud)

use*_*310 12

还有一种方法可以使用来自 rxjs/observable/bindCallback 的 bindCallback

const observable=bindCallback(functionWhichExpectsCallBack)
Run Code Online (Sandbox Code Playgroud)

例如

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


小智 9

你可以这样做.

get isLoggedIn(): Observable<boolean> {

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

  • [bindCallback](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-bindNodeCallback) 是自 RxJs 6 以来解决该问题的现代方法。结帐 [这些示例](https ://rxjs-dev.firebaseapp.com/api/index/function/bindCallback#convert-jquery-s-getjson-to-an-observable-api)。 (2认同)

am0*_*0wa 8

注意:bindCallbackObservable.create弃用,
您可以使用new Observable

...
return new Observable((subscriber) => {
  firebase
    .auth()
    .onAuthStateChanged((user) => {
      subscriber.next(user);
    })
}
Run Code Online (Sandbox Code Playgroud)

  • `bindCallback` 未弃用 https://rxjs-dev.firebaseapp.com/api/index/function/bindCallback (3认同)