【问题标题】:In ReactNative, which Async Await method is better in these two and why?在 React Native 中,这两种方法中哪种 Async Await 方法更好,为什么?
【发布时间】:2018-05-24 18:24:47
【问题描述】:

verifyUser等待verifyUserSignInSuccess等待userSnapshot等待user

这里在这两个函数中,对于ReactNative app在正确性、内存、时间方面会更有效:

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

或者嵌套的异步等待:

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

【问题讨论】:

  • 我认为第一个选项更好,因为更容易阅读。我不会使用 async/await,而是使用 Promise。第二个是 async/await 承诺的混合,这使得它有点难以阅读。我的意见是,我会用链式 Promise 让它干净又漂亮:)
  • 第一个更具可读性,比if (user) / else 块突出。

标签: react-native async-await es6-promise


【解决方案1】:

根据documentationonAuthStateChanged()函数返回

观察者的取消订阅功能。

所以你可以:

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

然后:

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

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

【讨论】:

    【解决方案2】:

    时间 - 因为您的所有异步函数都需要一个接一个地运行,无论您使用 async/await 或 Promise 链接或两者混合使用的任何方法都只需要相同的时间。

    正确性 - 两者在逻辑上都是正确的,并且工作方式相同。但是 async/await 是 JS 中用于解决 Promise 链接问题的最新补充。 Promise 链接使代码难以阅读。最好坚持 async/await。对于需要并行运行两个异步函数的情况,请使用 await Promise.all() 等。最后,这是您的个人喜好。

    内存? - 我不知道

    在 github 上免费阅读这本书,其中包含有关 Promise、异步函数、异步/等待等的详细信息。 https://github.com/getify/You-Dont-Know-JS

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 2011-12-29
      相关资源
      最近更新 更多