#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);