gpt4 book ai didi

javascript - React Native fetch 仅在第二次或第三次尝试时返回

转载 作者:行者123 更新时间:2023-11-30 15:18:17 25 4
gpt4 key购买 nike

我有一个使用使用 AsyncStorage 在本地保存的参数的提取。但是我的提取仅在第二次或第三次尝试时返回数据,因此当我尝试在我的渲染器上映射数据时,它说它无法映射未定义的数据。

这是我的 AsyncStorage 和获取代码:

  componentWillMount(){
AsyncStorage.getItem('key').then((codigo)=>{
this.setState({value: JSON.parse(codigo)});
this.getData()
})
}


getData(){
fetch(`URL/portalacv_ws.asmx/GetDetalhesViatura?CarID=${this.state.value}`)
.then((response) => { return response.json()})
.then(res => {
this.setState({data: res})
})
}

这是我在控制台上得到的:

enter image description here

最佳答案

您面临的问题是两种方法都是async。在您的情况下,您应该在获取项目后调用 getData 作为回调。

代码说明:

componentWillMount(){
AsyncStorage.getItem('key').then((codigo)=>{
//This code runs async, so when you call getData, value has not been changed yet (Or at least you cannot be sure).
this.setState({value: JSON.parse(codigo)});
//Printing here this.state.value will help you to understand
this.getData()
})
}

getData(){
fetch(`URL/portalacv_ws.asmx/GetDetalhesViatura?CarID=${this.state.value}`)
.then((response) => { return response.json()})
.then(res => {
this.setState({data: res})
})
}

如何解决?:

componentWillMount(){
AsyncStorage.getItem('key').then((codigo)=>{
this.setState({value: JSON.parse(codigo)}, () => {
//Here you are pretty sure that the setState has already done.
this.getData()
});
})
}

getData(){
fetch(`URL/portalacv_ws.asmx/GetDetalhesViatura?CarID=${this.state.value}`)
.then((response) => { return response.json()})
.then(res => {
this.setState({data: res})
})
}

编辑:

查看整个组件后,结论是 render 方法在 setState 之前和之后执行一次,这就是为什么第一次未定义,第二次是你期望的值。

因此,为了解决这种情况,一种可能的方法是标记获取数据的操作,并在获取完成后进行渲染。或多或少,这个想法是:

export default class Favoritos extends Component {
constructor(props) {
super(props);
this.state = {
value: null,
data: null,
fetching: false
};

//Binding is not needed, but...
this.getData = this.getData.bind(this);
this.onPress = this.onPress.bind(this);
}

componentWillMount(){
this.setState({ fetching: true }, () => {
AsyncStorage.getItem('key').then((codigo)=>{
this.setState({value: JSON.parse(codigo)}, () => {
this.getData()
.then((data) => {
this.setState({
data: data,
fetching: false
})
})
});
})
});
}


getData(){
return fetch(`URL/portalacv_ws.asmx/GetDetalhesViatura?CarID=${this.state.value}`)
.then((response) => { return response.json()})
}

onPress(){
this.setState({ fetching: true }, () => {
this.getData()
.then((data) => {
this.setState({
data: data,
fetching: false
})
})
});
}

render() {
if(this.state.fethcing){
return (
<View style={{ flex: 1, backgroundColor: 'white' }}>
Fetching data...
</View>
);
} else {
return (
<View style={{ flex: 1, backgroundColor: 'white' }}>
<ScrollView>
<TouchableHighlight onPress={this.onPress}>
...
</TouchableHighlight>
<Text>
{this.state.value}
</Text>
</ScrollView>
</View>
);
}
}
}

在上面的代码中,我只留下了值得质疑的代码,原来的代码更多。

关于javascript - React Native fetch 仅在第二次或第三次尝试时返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44161779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com