приведенный ниже код вызовет fetch () для получения некоторых данных, и только после получения он отобразит один вывод. Но при этом всегда не удается обновить представление после асинхронного вызова. Я новичок в этом реагировании на родные асинхронные вызовы, поэтому я хотел бы получить некоторую помощь в этом. Вот необходимые части кода.
import React from 'react'
import {StyleSheet, View, ScrollView, Alert} from 'react-native';
import {Card, Button, Text} from 'react-native-elements';
import {TextField} from 'react-native-material-textfield';
class MyScreen extends React.Component {
static navigationOptions = ({navigation}) => ({
title: 'Title'
});
constructor(props) {
super(props);
const {navigation} = this.props;
this.state = {
loaded: false
};
}
async componentWillMount() {
let responseJson = await this.fetchData().done();
console.info(responseJson);
console.info('componentWillMount finished');
}
fetchData = async () => {
const response = await fetch('myurl/' + GLOBAL.account_data.account.emp_number, {
method: 'GET',
headers: new Headers({
'Authorization': 'Bearer ' + GLOBAL.access_token,
'Content-Type': 'application/json'
})
});
return await response.json();
};
render() {
let view;
console.info('in render');
if (this.state.loaded) {
view = <Text>Vikasitha</Text>
} else {
view = <Text>Buddhi</Text>
}
return (
view
)
}
}
const styles = StyleSheet.create({
card_info: {
flex: 1,
height: 10
},
card_leave: {
flex: 2,
height: 30
}
});
export default MyInfoPersonalDetailsScreen;
Журнал консоли печатается в следующем порядке.
console.info('in render')
console.info(responseJson) //prints undefined
console.info('componentWillMount finished')
Но если функции await и async синхронизируются правильно, это должно быть в порядке,
console.info(responseJson)
console.info('componentWillMount finished')
console.info('in render')
Я просто хочу, чтобы поток был в правильном порядке. Речь идет о порядке выполнения, когда используются конструктор, componentWillMount и render. Не беспокойтесь о неиспользуемых переменных и недостающих частях.
Любая помощь приветствуется !!
Я пытался добавить, что прошел через них, используя такое событие, как нажатие кнопки, поведение может быть достигнуто, но проблема в том, что при использовании с componentWillMount порядок выполнения неясен.
где ты нашел async componentWillMount ??
Не помню, но таких как medium.com/front-end-hacking/… много. Я также не знаю, является ли это лучшей практикой, пока я не пойму это правильно.
ИМХО это выглядит немного странно, не популярно ... попробуйте версию из комментариев с initialize = async () - это более стандартный способ ... но я бы не стал использовать await asyncSetState - он ничего не делает - setState уже асинхронен, netActivity можно установить с помощью o ожидание тоже (данные получены / декодированы). только: const {ip} = await res.json() setState({ipAddress: ip}) StatusBar.setNetworkActivityIndicatorVisible(false)
Не понял. Как это помогает правильно оформить порядок исполнения? Я уже жду ответа. Json ()
не возвращайте его, setState
изучить стандартный поток fetch() / .then / setState
Я понял это. Я рассматривал это состояние реакции угловатым образом. Похоже, что функция рендеринга снова запускается после каждого вызова this.setState. вызов this.state.variable_name так не работает. Спасибо xadm.
обучающие программы для этих знаний;)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


componentDidMount() {
// just call async function in didMount
this.fetchData();
}
fetchData = async () => {
const response = await fetch('myurl/' + GLOBAL.account_data.account.emp_number, {
method: 'GET',
headers: new Headers({
'Authorization': 'Bearer ' + GLOBAL.access_token,
'Content-Type': 'application/json'
})
});
let result = await response.json();
console.info(result);
console.info(responseJson);
console.info('componentWillMount finished');
// update your state here
this.setState({result});
};
прочтите базовое руководство по fetch / setState