2017-12-11 134 views
5

verifyUser który czeka verifyUserSignInSuccess który czeka userSnapshot który czeka userW ReactNative, która metoda Async Await jest lepsza w tych dwóch przypadkach i dlaczego?

Tu, w tych dwóch funkcji, które będą bardziej efektywne pod względem poprawności, pamięć, czas na ReactNative aplikacji:

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

Or zagnieżdżonego Async Oczekuje:

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

Myślę, że pierwsza opcja jest lepsza, ponieważ łatwiej jest czytać. Nie używałbym async/czekam, ale zamiast tego obiecuję. Druga to mieszanka asynchronicznej/oczekującej obietnicy, która sprawia, że ​​trochę trudniej ją odczytać. Moim zdaniem, złapałbym obietnicę, żeby była czysta i miła :) – parohy

+0

Pierwsza jest bardziej czytelna, przekreśla blok "if (user)/else". – Damon

Odpowiedz

2

Według documentation funkcja onAuthStateChanged() Zwraca

Funkcja rezygnacji z subskrypcji dla obserwatora.

więc można po prostu:

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

, a następnie:

unsubscribe(); do rejestracji dla obserwatora.

onAuthStateChanged jest obserwatorem, który dzwoni do obserwatora, gdy użytkownicy byli zalogowani, wylogowani lub kiedy zmieniono token tożsamości w sytuacjach takich jak wygaśnięcie znacznika lub zmiana hasła. więc drugi to najlepsze rozwiązanie. każde logowanie lub zmiana.

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

że jest poprawna przekroczyć czek jest użytkownik jest ważny lub nie .i dont't zdaniem nie jest wymagane jest porównanie pamięci.

2

Czas - Ponieważ wszystkie funkcje asynchroniczne muszą działać jeden po drugim, niezależnie od wybranej metody użyj async/czekaj lub obiecuj łańcuchy lub połączenie obu zajmie tylko ten sam czas.

Prawidłowość - Oba są poprawne logicznie i będą działać tak samo. Ale async/await to najnowszy dodatek do JS, który rozwiązuje problem obiecywania nadziei. Obietnica łańcuchowa pozostawia kod trudny do odczytania. Lepiej trzymaj się asynchronicznie/poczekaj. W sytuacjach, w których potrzebujesz równolegle wykonywać dwie asynchroniczne funkcje, użyj await Promise.all() itd. Ostatecznie to twoja osobista preferencja.

Pamięć? - Nie mam pojęcia o tym

Przeczytaj tę książkę na swojej wolnej github, który zawiera szczegółowe informacje na temat obietnic, funkcje async, asynchroniczny/Oczekujcie itp https://github.com/getify/You-Dont-Know-JS

Powiązane problemy