angular - कन्वर्ट प्रॉमिस टू ऑब्जर्वेबल




firebase firebase-authentication (3)

मैं अपने सिर को वेधशालाओं के चारों ओर लपेटने की कोशिश कर रहा हूं। मैं प्रेक्षकों के विकास और पठनीयता के मुद्दों को हल करने के तरीके से प्यार करता हूं। जैसा कि मैंने पढ़ा है, लाभ काफी हैं।

HTTP और संग्रह पर वेधशालाएं सीधे आगे लगती हैं। मैं इस तरह के कुछ को कैसे अवलोकन पैटर्न में बदल सकता हूं।

यह प्रमाणीकरण प्रदान करने के लिए मेरे सेवा घटक से है। मैं डेटा, त्रुटि और पूर्ण हैंडलर के समर्थन के साथ Angular2 में अन्य HTTP सेवाओं की तरह काम करना पसंद करूंगा।

firebase.auth().createUserWithEmailAndPassword(email, password)
        .then(function(firebaseUser) {
             // do something to update your UI component
             // pass user object to UI component
        })
        .catch(function(error) {
             // Handle Errors here.
             var errorCode = error.code;
             var errorMessage = error.message;
             // ...
        });

यहाँ किसी भी मदद की बहुत सराहना की जाएगी। EventEmitter बनाने के लिए मेरे पास एकमात्र वैकल्पिक समाधान था। लेकिन मुझे लगता है कि यह सेवा अनुभाग में चीजों को करने का एक भयानक तरीका है


से

पहले से बनाए गए वादे को सीधे एक वेधशाला में बदलने के लिए उपयोग from

import { from } from 'rxjs';

const observable = from(promise);

जैसा कि इनर प्रॉमिस पहले से ही बना है (या ऑब्जर्वेबल के रूप में उसी समय बनाया जाएगा) प्रॉमिस के शरीर को निष्पादित किया जा रहा है या पहले से ही ऑब्जर्वेबल के रूप में हल हो गया है। अगर इनर प्रॉमिस ने पहले से ही एक नया सब्सक्राइबर हल कर लिया है तो ऑब्जर्वेबल को उसका मूल्य तुरंत मिल जाएगा।

टालना

इनपुट के रूप में एक प्रोमिस फ़ैक्टरी फ़ंक्शन के साथ defer उपयोग करें और एक ऑब्ज़र्वेबल के लिए एक प्रोमिस के निर्माण और रूपांतरण को स्थगित करने के लिए।

import { defer } from 'rxjs';

// getPromise has no parameters and returns a Promise
const observable = defer(getPromise)

// getPromise has parameters and returns a Promise
const observable = defer(() => getPromise(myParameters));

इससे अंतर यह है कि defer एक ग्राहक की प्रतीक्षा करता है और उसके बाद ही दिए गए प्रॉमिस फ़ैक्टरी फ़ंक्शन को कॉल करके एक नया वादा करता है। यह तब उपयोगी होता है जब आप एक ऑब्जर्वेबल बनाना चाहते हैं, लेकिन नहीं चाहते कि इनर प्रॉमिस को तुरंत निष्पादित किया जाए। इनर प्रॉमिस को तभी अंजाम दिया जाएगा, जब कोई ऑब्जर्वेबल को सब्सक्राइब करेगा। प्रत्येक ग्राहक को अपना नया ऑब्जर्वेबल भी मिलेगा।

उदाहरण में from और defer बीच का अंतर: https://stackblitz.com/edit/rxjs-1jd2x4


आप एक विषय का उपयोग भी कर सकते हैं और वादे से इसके अगले () फ़ंक्शन को ट्रिगर कर सकते हैं। नीचे नमूना देखें:

नीचे जैसा कोड जोड़ें (मैंने सेवा का उपयोग किया)

class UserService {
  private createUserSubject: Subject < any > ;

  createUserWithEmailAndPassword() {
    if (this.createUserSubject) {
      return this.createUserSubject;
    } else {
      this.createUserSubject = new Subject < any > ();
      firebase.auth().createUserWithEmailAndPassword(email,
          password)
        .then(function(firebaseUser) {
          // do something to update your UI component
          // pass user object to UI component
          this.createUserSubject.next(firebaseUser);
        })
        .catch(function(error) {
          // Handle Errors here.
          var errorCode = error.code;
          var errorMessage = error.message;
          this.createUserSubject.error(error);
          // ...
        });
    }

  }
}

नीचे दिए गए घटक से उपयोगकर्ता बनाएँ

class UserComponent {
  constructor(private userService: UserService) {
    this.userService.createUserWithEmailAndPassword().subscribe(user => console.log(user), error => console.log(error);
    }
  }


यदि आप RxJS 6.0.0 का उपयोग कर रहे हैं:

import { from } from 'rxjs';
const observable = from(promise);






firebase-authentication