如何在Async funcion上进行回调?

时间:2018-04-24 13:30:03

标签: javascript react-native

我有以下代码检查user_id(如果可用)然后登录,但只有在我刷新应用程序时它才会登录。知道如何在没有这个的情况下实现这一目标吗?

这是功能的顺序:

首先点击Login.js中的登录按钮:

<TouchableOpacity onPress={handleSubmit(_signIn)} style={{margin: 10, alignItems: 'center'}}>

然后是_signIn

中的Login.js函数
_signIn = (values, dispatch) => {
  const email = values.email;
  const password = values.password;
  dispatch(loginUser(email, password));
}

现在我们从loginUser

authActions.js发送了电子邮件和密码
export function loginUser(email, password) {
  return function (dispatch) {
    return axios.post(SIGNIN_URL, { email, password }).then((response) => {
      var { user_id, token } = response.data;
      onSignIn(user_id); // Here I pass 'user_id' to onSignIn function
    }).catch((error) => {
      dispatch(addAlert("Could not log in."));
    });
  };
}

现在我们从user_id

中的loginUser获取Auth.js
import { AsyncStorage } from "react-native";

const USER_KEY = "auth_key";

export const onSignIn = (user_id) => AsyncStorage.setItem(USER_KEY, user_id);
export const onSignOut = () => AsyncStorage.removeItem(USER_KEY);

export const isSignedIn = () => {
  return new Promise((resolve, reject) => {
    AsyncStorage.getItem(USER_KEY)
      .then(res => {
        if (res !== null) {
          resolve(true);
        } else {
          resolve(false);
        }
      })
      .catch(err => reject(err));
  });
};

现在在App.js我正在调用函数isSignedIn来检查user_id是否可用,如果有,则选择要显示的屏幕

 constructor(props) {
    super(props);

    this.state = {
      signedIn: false,
      checkedSignIn: false
    };
  }

  componentDidMount() {
    isSignedIn()
      .then(res => this.setState({ signedIn: res, checkedSignIn: true }))
      .catch(err => alert("An error occurred"));
  }

  render() {
    const { checkedSignIn, signedIn } = this.state;

    // If we haven't checked AsyncStorage yet, don't render anything (better ways to do this)
    if (!checkedSignIn) {
      return null;
    }

    const Layout = createRootNavigator(signedIn);

1 个答案:

答案 0 :(得分:0)

它不是异步函数回调问题 - 我知道如何使用它,因为你已经在isSignedIn函数中使用它了。

您确实致电onSignIn(userId),但您没有通知任何人。那些调用isSignedIn的函数应该以某种方式知道登录的用户。

基于这个问题以及之前的问题,我想您应该选择应用程序的体系结构(redux或只是函数式编程或其他)并记住它。
如果您想使用redux,您应该发送一个关于登录用户的操作,并反映您需要它的状态更改。