【问题标题】:Observable next operator usage confusion可观察到的 next 运算符使用混乱
【发布时间】:2016-11-23 18:13:06
【问题描述】:

我正在通过 codebase 进行 angularfire 身份验证,但我无法理解这段代码的工作原理。

基本上,我对observer.next() 的使用方式以及在何种情况下使用感到困惑。

我知道这个方法应该返回一个 observable,但是在它上面做 .next() 有什么帮助。

我还查看了next()here 的文档,它是takelast 的别名。

我仍然无法理解这是如何在这里工作的。

loginWithFacebook() {
     return Observable.create(observer => {
     if (this.platform.is('cordova')) {
        Facebook.login(['public_profile', 'email']).then(facebookData => {
        let provider = firebase.auth.FacebookAuthProvider.credential(facebookData.authResponse.accessToken);
        firebase.auth().signInWithCredential(provider).then(firebaseData => {
        this.af.database.list('users').update(firebaseData.uid, {
          name: firebaseData.displayName,
          email: firebaseData.email,
          provider: 'facebook',
          image: firebaseData.photoURL
        });
        observer.next();
      });
    }, error => {
      observer.error(error);
    });
  } else {
    this.af.auth.login({
      provider: AuthProviders.Facebook,
      method: AuthMethods.Popup
    }).then((facebookData) => {
      this.af.database.list('users').update(facebookData.auth.uid, {
        name: facebookData.auth.displayName,
        email: facebookData.auth.email,
        provider: 'facebook',
        image: facebookData.auth.photoURL
      });
      observer.next();
    }).catch((error) => {
      console.info("error", error);
      observer.error(error);
    });
  }
});

提前致谢!!!

【问题讨论】:

  • .next() 不会在返回的 Observable 上调用。它被称为观察者。简而言之,它使创建的 observable 发出一个事件。

标签: angular reactive-programming angularfire observable angularfire2


【解决方案1】:

该函数返回一个 Observable,下一个和错误将通知订阅者处理回调。像电子邮件客户端一样工作,您可以打开多个客户端,当“下一个”电子邮件进来时,它们会处理消息。

【讨论】:

  • 感谢@targunp,您的回答肯定有帮助。我还在我的答案中附加了一个链接 jsbin 做检查。
【解决方案2】:

只是对@tagunp 举例说明的一些补充,这里是link to jsbin

它触发从观察者到订阅者的消息,其中的值已更改,next()error() 回调。

var source = Rx.Observable.create(observer => {
    Rx.Observable.range(0,5).subscribe(
      data => { 
        console.log(data)
        if(data > 2) {
        // conveys to the subscriber of source
        // that values has changed
        observer.next("greater than 2");
      }
    }
  )
})

source.subscribe(
  data => console.log(data)
)

Output:-

0
1
2
3
"greater than 2"
4
"greater than 2"

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2019-08-01
    • 1970-01-01
    • 2017-12-17
    • 2014-06-04
    相关资源
    最近更新 更多