在ReactNative中,Async Await方法在这两个方面更好,为什么?

Sri*_*C G 7 async-await es6-promise react-native

verifyUser等待verifyUserSignInSuccess等待的userSnapshot等待等待user

这里有两个函数,它们在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));
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

或嵌套异步等待:

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));
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

Chi*_*ahu 2

根据文档,该onAuthStateChanged()函数返回

观察者的取消订阅功能。

所以你可以:

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 
});
Run Code Online (Sandbox Code Playgroud)

进而:

unsubscribe();用于注册观察者。

onAuthStateChanged是一个观察者,当用户登录、注销或用户的 ID 令牌在令牌过期或密码更改等情况下发生更改时,它会调用观察者。所以第二个是最好的解决方案。每次登录或更改。

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

交叉检查用户是否有效是正确的。我不认为需要进行内存比较。