【问题标题】:How can I make an API call that depends on a value which is set by another call?如何进行取决于另一个调用设置的值的 API 调用?
【发布时间】:2019-02-20 01:35:35
【问题描述】:

我有一个登录功能,我正在设置一个令牌,该令牌保存在 redux 存储中,然后,在登录发生后,我需要再次调用 api,它将向主屏幕提供数据。但为了打这个电话,我需要令牌。

这是我需要调用的主屏幕组件:

// imports

import styles from '../../styles/HomeScreenStyles';
import { passengersDataAction } from './actions/homeScreen';

class HomeScreen extends Component {
  static navigationOptions = {
    header: null,
  };

  componentDidMount() {
    this.GetPassengersData();
  }

  GetPassengersData = async () => {
    // userToken is coming from the store
    const { passengersDataActionHandler, userToken } = this.props;
    if (userToken && userToken !== null) {
      try {
        const response = await fetch(
          'http://myAPI/public/api/getPassengers',
          {
            method: 'POST',
            headers: {
              Authorization: `Bearer ${userToken}`,
              Accept: 'application/json',
              'Content-Type': 'application/json',
            },
          },
        );
        const responseJson = await response.json();
          passengersDataActionHandler(responseJson.success.data);      
      } // catch ...
    }
  };

  render() {
    return <TabView style={styles.container} />;
  }
}

// export

GetPassengersData 被调用时,userToken 还不存在,所以我的请求直接转到 catch 错误回调。

我该如何处理?

编辑: 我在上面放置的 API 调用是我需要令牌的地方。

调用获取登录数据:

import { Alert, AsyncStorage } from 'react-native';
import { has } from 'lodash';
import PropTypes from 'prop-types';

const FetchLoginData = async (
  username,
  password,
  navigation,
  userTokenActionHandler,
) => {
  try {
    const response = await fetch(
      'http://myAPI/public/api/driverlogin',
      {
        method: 'POST',
        headers: {
          Accept: 'application/json',
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ email: username, password }),
      },
    );
    const responseJson = await response.json();
    if (has(responseJson, 'error')) {
      Alert.alert('Error', 'Please check your credentials.');
    } else {
      // HERE I SET THE TOKEN
      await AsyncStorage.setItem('userToken', responseJson.success.token);
      userTokenActionHandler(responseJson.success.token);
      navigation.navigate('App');
    }
  } catch (error) {
    Alert.alert(
      'Error',
      'There was an error with your request, please try again later.',
    );
  }
};

FetchLoginData.propTypes = {
  navigation: PropTypes.shape({}).isRequired,
  userTokenActionHandler: PropTypes.func.isRequired,
};

export default FetchLoginData;

【问题讨论】:

  • 我们能看到获取令牌的调用吗?我假设它存储在 this.props 中?
  • 嗨@MarkWheeler 看到我的最后更新。我刚刚发布了代码。
  • 也许你应该使用 componentWillReceiveProps 来运行 GetPassengersData 函数。因为CDM只跑一个,不看props的变化,CWRP就是这么干的。
  • @TamDc 根据反应文档 -> UNSAFE_componentWillReceiveProps -> reactjs.org/docs/…
  • @Non 您可以将userToken 设置为HomeScreen 组件的state,然后改用getDerivedStateFromProps

标签: javascript reactjs ecmascript-6


【解决方案1】:

您可以在这里拨打第二个电话:

try {
    const response = await fetch(
      'http://myAPI/public/api/getPassengers',
      {
        method: 'POST',
        headers: {
          Authorization: `Bearer ${userToken}`,
          Accept: 'application/json',
          'Content-Type': 'application/json',
        },
      },
    );
   const responseJson = await response.json();
      passengersDataActionHandler(responseJson.success.data);  

   // **put second call here you have token here send it to second api call**

  }

【讨论】:

  • 嗯,我上面的 API 调用是我需要令牌的地方。
猜你喜欢
  • 2015-06-22
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多