सरलीकृत समस्या का कारण बनता है। एक वादा के अंदर this.setState को कॉल करना, वादे लंबित समाप्त होने से पहले प्रस्तुत करता है।वाइस के अंदर यहसेट अजीब व्यवहार अजीब व्यवहार
मेरे समस्याएं हैं:
- this.setState, immediatly
- लौटे मैं इसे async होने की उम्मीद नहीं है, ताकि लंबित वादा पहले बंद कर दिया जाएगा।
- यदि रेंडर फ़ंक्शन के अंदर कुछ तोड़ जाएगा, तो वादा के अंदर पकड़ को बुलाया जाता है।
- शायद 1 जैसा ही मुद्दा हो सकता है कि ऐसा लगता है कि प्रस्तुत करना अभी भी उस वादे के संदर्भ में है जिसमें यह .setState कहा जाता था।
import dummydata_rankrequests from "../dummydata/rankrequests";
class RankRequestList extends Component {
constructor(props) {
super(props);
this.state = { loading: false, data: [], error: null };
this.makeRankRequestCall = this.makeRankRequestCall.bind(this);
this.renderItem = this.renderItem.bind(this);
}
componentDidMount() {
// WORKS AS EXPECTED
// console.log('START set');
// this.setState({ data: dummydata_rankrequests.data, loading: false });
// console.log('END set');
this.makeRankRequestCall()
.then(done => {
// NEVER HERE
console.log("done");
});
}
makeRankRequestCall() {
console.log('call makeRankRequestCall');
try {
return new Promise((resolve, reject) => {
resolve(dummydata_rankrequests);
})
.then(rankrequests => {
console.log('START makeRankRequestCall-rankrequests', rankrequests);
this.setState({ data: rankrequests.data, loading: false });
console.log('END _makeRankRequestCall-rankrequests');
return null;
})
.catch(error => {
console.log('_makeRankRequestCall-promisecatch', error);
this.setState({ error: RRError.getRRError(error), loading: false });
});
} catch (error) {
console.log('_makeRankRequestCall-catch', error);
this.setState({ error: RRError.getRRError(error), loading: false });
}
}
renderItem(data) {
const height = 200;
// Force a Unknown named module error here
return (
<View style={[styles.item, {height: height}]}>
</View>
);
}
render() {
let data = [];
if (this.state.data && this.state.data.length > 0) {
data = this.state.data.map(rr => {
return Object.assign({}, rr);
});
}
console.log('render-data', data);
return (
<View style={styles.container}>
<FlatList style={styles.listContainer1}
data={data}
renderItem={this.renderItem}
/>
</View>
);
}
}
currrent लॉग दिखाता है:
- प्रस्तुत करना-डेटा, []
- स्टार्ट makeRankRequestCall-rankrequests
- प्रस्तुत करना-डेटा, [। ..]
- _makeRankRequestCall-promisecatch त्रुटि: अज्ञात नामित मॉड्यूल ...
- प्रस्तुत करना-डेटा, [...]
- संभव बिना क्रिया वादा
एंड्रॉयड एम्यूलेटर "प्रतिक्रिया": "16.0.0- alpha.12 ", " प्रतिक्रिया देशी ":" 0.46.4 ",
संपादित: this.setState आसपास रैपिंग setTimeout भी
काम करता हैsetTimeout(() => {
this.setState({ data: respData.data, loading: false });
}, 1000);
EDIT2: समानांतर https://github.com/facebook/react-native/issues/15214
मैं मुसीबत बिल्कुल इसलिए जो आप कोशिश कर रहे हैं समस्या आ रही है समाधान करना। क्या आप 'console.log (" done ") के समय केवल एक बार फिर से प्रस्तुत करने का प्रयास कर रहे हैं;' निष्पादित किया गया है? यदि ऐसा है, तो इसे प्राप्त करने का एक तरीका 'चाहिएComponentUpdate() 'को ओवरराइट करना होगा ताकि जब आप पुनः प्रस्तुत करने के लिए तैयार हों तो यह हमेशा' झूठा 'लौटाता है, और' this.force अद्यतन करें '। https://facebook.github.io/react/docs/react-component.html#forceupdate – therobinkim