2017-12-11 104 views
5

verifyUser जो verifyUserSignInSuccess जो userSnapshot जो userरेक्टनेटिव में, जो इन दोनों में Async Await विधि बेहतर है और क्यों?

यहाँ इन दो कार्यों में इंतजार कर रहा है, जो शुद्धता, स्मृति, ReactNative अनुप्रयोग के लिए समय के संदर्भ में और अधिक प्रभावी हो जाएगा इंतजार कर रहा है इंतजार कर रहा है:

export function verifyUser() { 
    return async dispatch => { 
    dispatch(verifyUserSignInRequest()); 
    try { 
     const user = await firebase.auth().onAuthStateChanged(); 

     if (user) { 
      let userRef = "/user/" + user.uid; 
      const userSnapshot = await firebase 
      .database() 
      .ref(userRef) 
      .once("value"); 
      dispatch(verifyUserSignInSuccess(userSnapshot.val())); 
     } else { 
      dispatch(verifyUserSignInFailure(USER_NOT_SIGNED_IN)); 
     } 
    } catch (e) { 
     dispatch(verifyUserSignInFailure(e.message)); 
    } 
    }; 
} 

या नेस्टेड Async प्रतीक्षा करें:

export function verifyUser() { 
    return async dispatch => { 
    dispatch(verifyUserSignInRequest()); 
    try { 
     await firebase.auth().onAuthStateChanged(async user => { 
     if (user) { 
      let userRef = "/user/" + user.uid; 
      await firebase 
      .database() 
      .ref(userRef) 
      .once("value") 
      .then(() => { 
       dispatch(verifyUserSignInSuccess(userSnapshot.val())); 
      }); 
     } else { 
      dispatch(verifyUserSignInFailure(USER_NOT_SIGNED_IN)); 
     } 
     }); 
    } catch (e) { 
     dispatch(verifyUserSignInFailure(e.message)); 
    } 
    }; 
} 
+0

मुझे लगता है कि पहला विकल्प बेहतर है, क्योंकि पढ़ने में आसान है। मैं async/प्रतीक्षा का उपयोग नहीं करता, बल्कि इसके बजाय वादा करता हूं। दूसरा एक एसिंक/प्रतीक्षा वादा का मिश्रण है जो इसे पढ़ने के लिए थोड़ा कठिन बनाता है। मेरी राय है, मैं श्रृंखला को साफ और अच्छा रखने का वचन दूंगा :) – parohy

+0

पहला 'अधिक (उपयोगकर्ता)/अन्य' ब्लॉक से बाहर है, और अधिक पठनीय है। – Damon

उत्तर

2

documentation के अनुसार, onAuthStateChanged() फ़ंक्शन

शामिल इस पुस्तक GitHub पर अपने नि: शुल्क पढ़ें

पर्यवेक्षक के लिए सदस्यता रद्द करें। पर्यवेक्षक के लिए पंजीकरण के लिए

unsubscribe();:

तो आप बस कर सकते हैं:

var unsubscribe = firebase.auth().onAuthStateChanged((user) { 
    // handle it for changes signed in, signed out, or when the user's ID token changed in situations such as token expiry or password change 
}); 

और फिर।

onAuthStateChanged एक पर्यवेक्षक है जो पर्यवेक्षक को कॉल करता है, जब उपयोगकर्ता साइन इन होते हैं, साइन आउट होते हैं, या जब उपयोगकर्ता की आईडी टोकन टोकन समाप्ति या पासवर्ड परिवर्तन जैसी स्थितियों में बदल जाती है। तो दूसरा सबसे अच्छा समाधान है। हर लॉगिन या परिवर्तन।

` let userRef = "/user/" + user.uid; 
      await firebase 
      .database() 
      .ref(userRef) 
      .once("value") 
      .then(() => { 
       dispatch(verifyUserSignInSuccess(userSnapshot.val())); 
      }); 
     } else { 
      dispatch(verifyUserSignInFailure(USER_NOT_SIGNED_IN)); 
     }` 

जो क्रॉस चेक के लिए सही है, उपयोगकर्ता मान्य है या नहीं। मुझे नहीं लगता कि स्मृति तुलना की आवश्यकता है।

2

समय - चूंकि आपके सभी एसिंक कार्यों को अन्य किसी भी विधि के बाद चलाने की आवश्यकता है async/प्रतीक्षा या वादा करने का वादा या दोनों का मिश्रण केवल एक ही समय ले जाएगा।

सुधार - दोनों सही तर्कसंगत हैं और वही काम करेंगे। लेकिन वाइस चेनिंग की समस्या को हल करने के लिए जेएस के लिए नवीनतम जोड़ एसिंक/प्रतीक्षा है। वादा चेनिंग कोड को पढ़ने के लिए मुश्किल छोड़ देता है। बेहतर यू एसिंक/प्रतीक्षा करने के लिए चिपक जाती है। ऐसी परिस्थितियों के लिए जहां आपको समान रूप से दो एसिंक फ़ंक्शन चलाने की आवश्यकता होती है, await Promise.all() आदि का उपयोग करें। अंत में, यह आपकी व्यक्तिगत वरीयता है।

मेमोरी? - मुझे लगता है कि

पर पता नहीं है जो वादे पर विवरण, async काम करता है, async/इंतजार आदि https://github.com/getify/You-Dont-Know-JS

संबंधित मुद्दे