Как устранить ошибку «cb не является функцией» в React Native?

#javascript #reactjs #native

#javascript #reactjs #native

Вопрос:

текущий код

Index.js

 import Auth from 'app/src/common/Auth';

export default class Index extends React.Component {

async componentDidMount() {
    this.props.navigation.addListener('willFocus',
      Auth.me().then(async (response) => {
        await this.setState({ isLoggedIn: response });
      }));
}

...
}
  

Auth.js

 import axios from 'axios';
import { ENV } from 'app/env';
import { AsyncStorage } from 'react-native';

const { baseApiUrl } = ENV;

export default {
  async me() {
    try {
      let result = false;
      let token = await AsyncStorage.getItem('token');
      token = token.replace(/"/g, '');
      const response = await axios.get(`${baseApiUrl}/api/auth/me`, {
        headers: {
          Authorization: `Bearer ${token}`,
        },
      });
      if (response.data) {
        result = true;
      }
      return resu<
    } catch (error) {
      console.log(error);
    }
  },

};

  

ошибка

Я продолжаю получать эту ошибку.

Ошибка типа: cb не является функцией. (В ‘cb(data)’ ‘cb’ является экземпляром Promise)

Я был бы признателен, если бы вы могли дать мне какой-либо совет.

Ответ №1:

Трудно сказать без подробного знания вашего кода (или react), но из названия я бы ожидал, что this.props.navigation.addListener будет использоваться callback функция. Вместо этого вы передаете обещание.

 this.props.navigation.addListener('willFocus',
  Auth.me().then(async (response) => {
    await this.setState({ isLoggedIn: response });
  })
);
  

Попробуйте изменить код на:

 this.props.navigation.addListener('willFocus', () => {
  Auth.me().then(async (response) => {
    await this.setState({ isLoggedIn: response });
  })
});
  

Комментарии:

1. Спасибо! Похоже, мне нужно узнать больше о callback 🙁 В любом случае, спасибо за совет.

Ответ №2:

РЕДАКТИРОВАТЬ: ответ @kai лучше (и правильнее) для текущей проблемы. Я оставлю ответ, хотя использование async / await для функции setState в любом случае неверно

Вы должны удалить await из setState:

 this.props.navigation.addListener('willFocus',
  Auth.me()
    .then((response) => {
      this.setState({ isLoggedIn: response });
    })
);
  

При использовании await Javascript ожидает обещание. Но this.setState не возвращает функцию.


В боковой заметке, если вам нужно дождаться применения функции setState, вы можете использовать обратный вызов в качестве второго параметра:

 this.setState({ data }, () => console.log("Now the new state has been applied!"))
  

Комментарии:

1. Большое вам спасибо. Я удалил await из setState .

Ответ №3:

Я устранил ту же ошибку, удалив прослушиватель из метода componentDidMount

 //this.props.navigation.addListener('focus', this._onFocus);