小能豆

如何异步/等待 redux-thunk 操作?

javascript

action.js

export function getLoginStatus() {
  return async(dispatch) => {
    let token = await getOAuthToken();
    let success = await verifyToken(token);
    if (success == true) {
      dispatch(loginStatus(success));
    } else {
      console.log("Success: False");
      console.log("Token mismatch");
    }
    return success;
  }
}

component.js

  componentDidMount() {
    this.props.dispatch(splashAction.getLoginStatus())
      .then((success) => {
        if (success == true) {
          Actions.counter()
        } else {
          console.log("Login not successfull");
        }
     });
   }

但是,当我使用 async/await 编写如下所示的 component.js 代码时,出现此错误:

Possible Unhandled Promise Rejection (id: 0): undefined is not a function (evaluating 'this.props.dispatch(splashAction.getLoginStatus())')

component.js

  async componentDidMount() {
     let success = await this.props.dispatch(splashAction.getLoginStatus());
     if (success == true) {
       Actions.counter()
     } else {
       console.log("Login not successfull");
     }
   }

我如何等待 getLoginStatus() 然后执行其余语句?使用 .then() 时一切都运行良好。我怀疑我的 async/await 实现中缺少了某些东西。试图弄清楚。


阅读 58

收藏
2024-06-07

共1个答案

小能豆

要使用async/awaitin `componentDidMount并正确处理已分派的操作,必须确保正确管理操作及其承诺解决方案。您遇到的错误通常表示this.props.dispatch未正确绑定或操作本身未按预期返回承诺。

以下是对您的实现的一种改进方法,可确保操作创建者和组件的使用都得到正确的协调:

action.js

确保getLoginStatus返回一个承诺,并且dispatch(loginStatus(success))后面跟着一个返回语句。

export function getLoginStatus() {
  return async (dispatch) => {
    let token = await getOAuthToken();
    let success = await verifyToken(token);
    if (success === true) {
      dispatch(loginStatus(success));
    } else {
      console.log("Success: False");
      console.log("Token mismatch");
    }
    return success;
  };
}

component.js

确保this.props.dispatch正确使用并且getLoginStatus正确等待。

import React from 'react';
import { connect } from 'react-redux';
import splashAction from './actions'; // Adjust the import path as needed
import { Actions } from 'react-native-router-flux';

class MyComponent extends React.Component {
  async componentDidMount() {
    try {
      let success = await this.props.dispatch(splashAction.getLoginStatus());
      if (success === true) {
        Actions.counter();
      } else {
        console.log("Login not successful");
      }
    } catch (error) {
      console.error("An error occurred:", error);
    }
  }

  render() {
    return (
      <div>
        {/* Your component's render logic */}
      </div>
    );
  }
}

// Assuming mapStateToProps and mapDispatchToProps are defined if needed
export default connect()(MyComponent);

解释

  1. 返回 Promise:确保getLoginStatus返回一个 Promise。该async函数已隐式执行此操作,因此 Promise 解析链应按预期工作。
  2. 正确dispatch使用:确保this.props.dispatch由 Redux 的 HOC 正确提供connect
  3. 错误处理:在函数中添加 try/catchasync来处理可能出现的任何错误。

常见陷阱

  • 不履行承诺:如果您的行动创建者不履行承诺,await就不会按预期工作。
  • 绑定不正确this.props.dispatch:确保this.props.dispatch可用,通常通过使用包装组件来确保connect
  • 类型检查:始终使用严格相等(===)来避免类型强制问题。

通过遵循这些步骤,您应该能够正确地等待getLoginStatus操作并处理其结果componentDidMount

2024-06-07