promise.all() 内的 setState react

IT技术 javascript reactjs
2021-05-16 22:15:41

我有一个小的 crud 应用程序,我正在尝试构建和输出一些数据。我必须进行 3 个不同的 api 调用,每个调用都返回一个Promise,并且我试图通过它自己的状态分配每个返回Promise。

export default class TableExampleControlled extends Component {

state = {
 rentalsData: [],
 driversData: [],
 vehiclesData: [],
};

componentDidMount() {
 Promise.all([rentals(), drivers(), vehicles()])
 .then((rentalsData,driversData, vehiclesData) => {
   this.setState({ rentalsData,driversData, vehiclesData });
   console.log(this.state)
});
};
render() {     
 const rentalEntries = this.state.rentalsData
 const tableRow = rentalEntries.map((data) =>
 <TableRow selected={this.isSelected(0)}>
    <TableRowColumn key={data.status}>{data.status}</TableRowColumn>
    <TableRowColumn key={data.vehicle}>{data.vehicle}</TableRowColumn>
    <TableRowColumn key={data.driver}>{data.driver}</TableRowColumn>
    <TableRowColumn key={data.email}>{data.email}</TableRowColumn>        
    <TableRowColumn key={data.start_date}>{data.start_date}</TableRowColumn>
    <TableRowColumn key={data.end_date}>{data.end_date}</TableRowColumn>
    <TableRowColumn key={data.rate}>{data.rate}</TableRowColumn>
  </TableRow >
);
2个回答

我在你的例子中看到了两个问题。Promise.all解析为一个数组变量。此数组的元素是您调用的结果。所以:

.then(result => {
  const [ rentalsData, driversData, vehiclesData ] = result;

  this.setState({ rentalsData,driversData, vehiclesData });  
});

此外,您无法在调用时立即看到状态,setState因为该方法是异步的。如果您想这样做,请尝试:

this.setState({ rentalsData,driversData, vehiclesData }, () => {
  console.log(this.state);
});

Promise.all将您的Promise解析为结果数组,将您的Promise更改.then为采用此数组,然后您可以使用数组语法访问其结果:

Promise.all([rentals(), drivers(), vehicles()])
 .then((results) => {
   this.setState({ 
     rentalsData: results[0],
     driversData: results[1], 
     vehiclesData: results[2] 
   });
});