从.map()方法中的dispatch函数返回promise

时间:2017-05-04 16:13:09

标签: javascript promise redux redux-thunk

我正在使用redux-thunk来管理一些副作用。问题如下。在我的react组件的某处,我有一个函数,负责在组件安装或获取新的道具fetchRequiredData()时获取所有必要的数据。

fetchRequiredData()内,我循环遍历一个数组,因为每个键都需要获取一些数据。我需要能够有一个过度的承诺,只有在.map()内的承诺得到解决时才能解决。如果我没有这个页面会遇到麻烦,因为它试图渲染它不能的东西。

简化代码示例

export const fetchRequiredData = (requiredAccounts) => (dispatch) => {
    // How to wrap the promises inside the .map() into 1 "big" promise?
    requiredAccounts.map(account => {
        dispatch(fetchAccount(account)); // Returns a promise
    });
}

在我的组件中,我应该可以执行以下操作

class Accounts extends Component {
    constructor(props) {
        super(props);

        this.state = {
            pending: true;
        }
    }

    componentDidMount() {
        this.setState({pending: true});
        this.props.fetchRequiredData().then(() => this.setState({pending: false}));
    }

    componentWillUpdate(nextProps, nextState) {
        this.setState({pending: true});
        this.props.fetchRequiredData().then(() => this.setState({pending: false}));
    }
}

1 个答案:

答案 0 :(得分:4)

您可以将所有承诺映射到数组中,然后使用Promise.all()函数解决所有这些问题:

const allPromises = requiredAccounts.map(account => {
    return dispatch(fetchAccount(account)); // Returns a promise
});
Promise.all(allPromises).then(() => {
  // ... do something after all promises were resolved ...
});